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 указатель в вашем объявлении.