Как передавать значения между классами на iPhone?
-
03-07-2019 - |
Вопрос
Я хочу отправить строку из одного класса в другой:
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"];Есть идеи, что с этим не так?
Решение
stringWithString — это метод класса, возвращающий автоматически выпускаемую строку.Вы должны называть это так:
myProperty = [NSString stringWithString:strURL];
Здесь я предполагаю, что ваше свойство выполняет копию, чтобы увеличить счетчик сохранения автоматически выпущенной строки, возвращаемой методом stringWithString.(Объекты, возвращаемые из вызовов alloc, имеют счетчик сохранения, равный единице, и не освобождаются автоматически.) Чаще всего строкам присваивается свойство copy, а не свойство сохранения — обычно вам нужна только собственная копия строки, а не общая ссылка на строка, принадлежащая кому-то другому.
Чего я также не могу понять, так это почему вы написали такой код, если только это не просто пример.Во 2 классе все, что вам нужно сделать, это написать
returnStr = [NSString stringWithString:@"URL"];
Другие советы
строка со строкой:— это сообщение, которое необходимо отправить классу NSString, а не экземпляру вашего класса (возвращается через alloc).
Правильный код должен быть:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [NSString stringWithString:strURL];
}
Возможно, вам захочется подробнее ознакомиться с идиомами выделения, хранения и автоматического освобождения указателей.Если по какой-то причине вы хотите выделить эту строку и вернуть ее из sendBackStr:сообщение, то вам, вероятно, понадобится этот код:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [[[NSString alloc] initWithString:strURL] autorelease];
}