我想知道在确定ObjectiveC中的某个属性是retain
还是copy
时是否遵循经验法则?
你如何决定它应该是什么?
答案 0 :(得分:10)
通常,您使用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)
。
答案 1 :(得分:2)
简而言之,assign
vs retain
vs copy
决定了合成访问者如何与Objective-C内存管理方案进行交互:
assign
是默认值,只是执行变量赋值retain
指定应在发送时发送新值-retain并发送旧值copy
指定应在发送时发送新值-copy并发送旧值。请记住,retain
已在创建的对象上完成(它会增加引用计数),而copy
会创建一个新对象。不过,区别在于您是要为对象添加另一个保留还是创建一个全新的对象。