Как передавать значения между классами на iPhone? - PullRequest
0 голосов
/ 02 марта 2009

Я хочу отправить строку из одного класса в другой:

1) В классе 1 я добавляю свойство для хранения строки:

@property (nonatomic, retain) NSString *str; 

2) и способ отправить обратно строку:


-(NSString *)sendBackStr:(NSString *)strURL
{
    NSString *str = [[NSString alloc] stringWithString:strURL];
    return str;
}

3) В классе 2 я добавляю свойство для хранения полученной строки:

@property (nonatomic, retain) NSString *returnStr; 

4) и следующий код:

Class1 *c1 = [[Class1 alloc] init]; 
returnStr = [c1 sendBackStr:@"URL"];

Но программа останавливается на returnStr = [c1 sendBackStr: @ "URL"]; Есть идеи о том, что с ним не так?

Ответы [ 2 ]

1 голос
/ 02 марта 2009

stringWithString - метод класса, возвращающий автоматически освобожденную строку. Вы должны называть это так:

myProperty = [NSString stringWithString:strURL]; 

Здесь я предполагаю, что ваше свойство выполняет копирование, чтобы увеличить счетчик сохранений для автоматически выпущенной строки, возвращаемой методом stringWithString. (Объекты, возвращаемые при вызовах alloc, имеют счет сохранения один и не высвобождаются автоматически.) Обычно для строк присваивается свойство copy, а не свойство retain - обычно вам просто нужна собственная копия строки, а не общая ссылка Строка принадлежит кому-то другому.

Я также не могу понять, почему вы написали такой код, если только это не пример. В классе 2 все, что вам нужно сделать, это написать

returnStr = [NSString stringWithString:@"URL"];
1 голос
/ 02 марта 2009

stringWithString: это сообщение, которое необходимо отправить классу NSString, а не экземпляру вашего класса (возвращается через alloc).

Правильный код должен быть:

-(NSString *)sendBackStr:(NSString *)strURL
{
    return [NSString stringWithString:strURL];
}

Возможно, вы захотите узнать больше об идиомах распределения, хранения и автоматического высвобождения указателей. Если вы хотите по какой-то причине выделить эту строку и вернуть ее из сообщения sendBackStr :, то вам, вероятно, понадобится следующий код:

-(NSString *)sendBackStr:(NSString *)strURL
{
    return [[[NSString alloc] initWithString:strURL] autorelease];
}
...