使用@property(copy)与@property(retain)的经验法则是什么?

时间:2011-08-18 23:24:50

标签: objective-c memory-management

我想知道在确定ObjectiveC中的某个属性是retain还是copy时是否遵循经验法则?

你如何决定它应该是什么?

2 个答案:

答案 0 :(得分:10)

通常,您使用copy来保护具有可变变体的类,例如NSStringNSArray,其他集合类等。要了解原因,请考虑此处发生的情况。

曾几何时,

@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)

答案 1 :(得分:2)

简而言之,assign vs retain vs copy决定了合成访问者如何与Objective-C内存管理方案进行交互:

  • assign是默认值,只是执行变量赋值
  • retain指定应在发送时发送新值-retain并发送旧值
  • copy指定应在发送时发送新值-copy并发送旧值。

请记住,retain已在创建的对象上完成(它会增加引用计数),而copy会创建一个新对象。不过,区别在于您是要为对象添加另一个保留还是创建一个全新的对象。