NSString (указатель / не указатель) назначить или сохранить - PullRequest
2 голосов
/ 01 сентября 2009

У меня четыре варианта одного класса.

Сочетание указатель, не указатель, назначение против копирования.

Каковы последствия использования каждого случая?

1)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

2)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

3)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

4) * * 1016

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end

Ответы [ 2 ]

9 голосов
/ 01 сентября 2009

1)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, retain);
@end

Вы не можете выделить NSObjects в стеке или в качестве переменных экземпляра объекта. В свои первые годы Objective-C действительно допускал это, но это больше не делает. Этот код неверен.

2)

@interface fruit:NSObject{
NSString apple;
}
@property(nonatomic, assign);
@end

Вы не можете выделить NSObjects в стеке или в качестве переменных экземпляра объекта. В свои первые годы Objective-C действительно допускал это, но это больше не делает. Этот код неверен.

3)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, retain);
@end

Вы сохраняете долю владения в экземпляре NSString, гарантируя, что он не будет освобожден, пока вы сохраняете это право собственности. Поскольку NSMutableString является подклассом NSString, возможно, вам присваивалась изменяемая строка при присваивании, поэтому другой код может изменять значение строки без вашего ведома (если вы не используете наблюдение значения ключа для наблюдения за этими изменениями). По этой причине обычно целесообразно использовать copy семантику для свойств, которые вы намерены хранить неизменяемым значением (NSString, NSData, NSArray, NSSet являются общими - хотя и не исчерпывающий - подозреваемые).

4)

@interface fruit:NSObject{
NSString *apple;
}
@property(nonatomic, assign);
@end

Вы не сохраняете право собственности на строку, что означает, что она может быть освобождена без вашего ведома. В средах подсчета ссылок это стандартная практика для свойств делегатов, поскольку их сохранение, вероятно, создаст цикл сохранения. Код, который отвечает за освобождение строки, должен установить для вашего свойства apple значение nil перед этим (в среде с пересчетом). В среде GC ваше назначение будет поддерживать строку в рабочем состоянии, если у вас есть __strong указатель, или вы получите нулевое значение (установите 0 в dealloc), если у вас есть __weak указатель в вашем объявлении.

2 голосов
/ 01 сентября 2009

Насколько мне известно, вы всегда должны использовать или сохранить или скопировать с NSString *. Присвоение указателю (4) не приведет к увеличению счетчика ссылок, поэтому утечка памяти или, скорее, это будет означать, что вы в конечном итоге получите доступ к освобожденной памяти, так как счетчик преждевременно достигнет 0.

Я не знаю, можно ли использовать NSString как нативный тип. Я всегда использую его как указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...