Должен ли я использовать @property (nonatomic, copy) или @property (неатомный, сильный) для моего (NSString *) attr в объекте A?
@interface PaneBean : NSObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *type;
@property(nonatomic,assign) NSInteger width;
@end
У меня есть PaneBean, как показано выше.
Использовать ли @property(nonatomic,copy)
или @property(nonatomic,strong)
для моего (NSString *) name
? В чем разница между ними?
И правильно ли писать 'assign' для NSInteger?
Любая помощь приветствуется. Спасибо заранее!
Ответы
Ответ 1
'copy' приведет к тому, что установщик для этого свойства создаст копию объекта и в остальном идентичен сильному. Вы использовали бы это, чтобы убедиться, что, если кто-то устанавливает ваше свойство в изменяемую строку, то мутирует строку, у вас все еще есть исходное значение. Если строка не изменена, Cocoa будет тихо оптимизировать операцию копирования, что приятно:)
"strong" сохранит ценность свойства до тех пор, пока не будет установлено что-то еще. Если вы хотите, чтобы входящие изменяемые строки менялись из-под вас (не невозможно, но не все, что обычно, вещь, чтобы хотеть), тогда сильная была бы правильная вещь. Как правило, сильное полезна для объектов, представляющих нечто более сложное, чем простое "значение" (т.е. Не NSString, NSNumber, NSValue и т.д.).
'assign' - это значение по умолчанию (и действительно только) для целого числа. Целые числа не могут быть сохранены или скопированы как объекты.
Ответ 2
Для атрибутов, тип которых является неизменяемым классом значений, который соответствует протоколу NSCopying, вы почти всегда должны указывать копию в своем объявлении @property. Указание сохранения - это то, чего вы почти никогда не хотите в такой ситуации. В не-ARC-силе будет работать как сохранение
Вот почему вы хотите сделать это:
NSMutableString *someName = [NSMutableString stringWithString:@"Chris"];
Person *p = [[[Person alloc] init] autorelease];
p.name = someName;
[someName setString:@"Debajit"];
Текущее значение свойства Person.name будет отличаться в зависимости от того, объявлено ли свойство сохраненным или скопированным - это будет @ "Debajit", если свойство отмечено с сохранением, но @ "Chris", если свойство отмечено копия.
Так как почти во всех случаях вы хотите предотвратить изменение атрибутов объекта за его спиной, вы должны пометить свойства, представляющие их копию. (И если вы пишете установщика самостоятельно, а не используете @synthesize, вы должны помнить, что на самом деле используйте копию вместо сохранения в ней.)
Ответ 3
copy
отправляет сообщение copy
заданному вами объекту, а strong
сохраняет его только (увеличивает счетчик ссылок).
Для NSString
или вообще любого непеременного класса с известными изменяемыми подклассами (NSArray
, NSDictionaty
, NSSet
), рекомендуется копировать, чтобы клиенты не устанавливали изменяемый экземпляр и не изменяли его из объекта.
Для примитивных типов (например, int) copy/strong не имеет смысла и по умолчанию используется назначение. Это зависит от вас, если вы хотите явно указать это.
Ответ 4
Сильный указывает на состав, а Weak указывает на агрегацию.
Копировать означает, что новый объект должен быть создан до того, как содержимое старого объекта будет скопировано в новый объект. Собственный объект PaneBean в этом случае будет состоять из вновь созданного объекта.