给出以下代码
@interface MyClass
{
SomeObject* o;
}
@property (nonatomic, retain) SomeObject* o;
@implementation MyClass
@synthesize o;
- (id)initWithSomeObject:(SomeObject*)s
{
if (self = [super init])
{
o = [s retain]; // WHAT DOES THIS DO? Double retain??
}
return self
}
@end
答案 0 :(得分:12)
这不是双重保留; s
只会被保留一次。
原因是您没有在初始化程序中调用合成的setter方法。这一行:
o = [s retain];
保留s
并将o
设为等于s
;也就是说,o
和s
指向同一个对象。永远不会调用合成的访问器;你可以完全摆脱@property
和@synthesize
行。
如果该行是:
self.o = [s retain];
或等效
[self setO:[s retain]];
然后将调用合成的访问器,这将第二次保留该值。请注意,通常不建议在初始值设定项中使用访问器,因此o = [s retain];
是编码init
函数时更常见的用法。