Какое практическое правило для использования @property (копия) против @property (сохранить)? - PullRequest
4 голосов
/ 19 августа 2011

Интересно, есть ли эмпирическое правило, которому вы следуете, когда решаете, должно ли данное свойство в ObjectiveC быть retain или copy?

Как вы решаете, каким оно должно быть

Ответы [ 2 ]

10 голосов
/ 19 августа 2011

Обычно вы используете copy для безопасности с классами, которые имеют изменяемые варианты, например NSString, NSArray, другие классы коллекций и т. Д. Чтобы понять почему, рассмотрите, что здесь происходит ...

Давным-давно

@interface MyClass : NSObject
@property (retain) NSString *happyString;
- (void)rejoice;
@end

Тогда однажды,

- (void)bigBadMethod {
    MyClass *myObject = [[[MyClass alloc] init] autorelease];
    NSMutableString *theString = [NSMutableString stringWithString:@"I'm happy!"];
    myObject.happyString = theString; // this is allowed because NSMutableString inherits from NSString
    [myObject rejoice]; // prints "I'm happy!"

когда вдруг ...

    [theString setString:@"BRAAAAIIINNNSSSSS"];
    [myObject rejoice]; // prints "BRAAAAIIINNNSSSSS"
}

И тебе бы этого не хотелось, не так ли? Поэтому используйте @property (copy), если вы не хотите, чтобы вас мутировали, пока вы не искали!

2 голосов
/ 19 августа 2011

В двух словах, assign против retain против copy определяет, как синтезированные средства доступа взаимодействуют со схемой управления памятью Objective-C:

  • assign является значением по умолчанию и простовыполняет присваивание переменной
  • retain указывает, что новое значение должно быть отправлено - сохранить при назначении, а старое значение отправлено, релиз
  • copy указывает, что новое значение должно быть отправлено - копия при назначениии старое значение отправлено release.

Помните, что retain выполняется на созданном объекте (это увеличивает количество ссылок), тогда как copy создает новый объект.Разница в том, хотите ли вы добавить еще одно сохранение к объекту или создать совершенно новый объект.

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