【发布时间】:2011-08-18 23:24:49
【问题描述】:
我想知道在决定 ObjectiveC 中的给定属性是否应该是 retain 或 copy 时,您是否遵循经验法则?
你如何决定它应该是哪个?
【问题讨论】:
标签: objective-c memory-management
我想知道在决定 ObjectiveC 中的给定属性是否应该是 retain 或 copy 时,您是否遵循经验法则?
你如何决定它应该是哪个?
【问题讨论】:
标签: objective-c memory-management
为了安全起见,通常您使用 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)!
【讨论】:
简而言之,assign vs retain vs copy 决定了合成访问器如何与 Objective-C 内存管理方案交互:
assign 是默认值,只是执行变量赋值retain 指定应发送新值 - 在分配时保留并发送旧值释放copy 指定应发送新值 - 分配时复制并发送旧值释放。请记住,retain 是在创建的对象上完成的(它会增加引用计数),而 copy 会创建一个新对象。那么,区别在于您是要向对象添加另一个保留还是创建一个全新的对象。
【讨论】: