4

给定以下代码

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

1 回答 1

12

这不是双重保留;s只会保留一次。

原因是您没有在初始化程序中调用合成的 setter 方法。这一行:

o = [s retain];

保留s并设置o为等于so也就是s指向同一个对象。合成访问器永远不会被调用;你可以完全摆脱@property@synthesize线。

如果该行是:

self.o = [s retain];

或等效地

[self setO:[s retain]];

然后将调用综合访问器,这将再次保留该值。请注意,通常不建议在初始化程序中使用访问器,因此在编写函数o = [s retain];时更常用。init

于 2010-02-12T23:55:43.017 回答