什么时候设置Objective-C属性保留?

时间:2010-02-12 23:46:29

标签: iphone objective-c memory-management retain

给出以下代码

@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

1 个答案:

答案 0 :(得分:12)

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

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

o = [s retain];

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

如果该行是:

self.o = [s retain];

或等效

[self setO:[s retain]];

然后将调用合成的访问器,这将第二次保留该值。请注意,通常不建议在初始值设定项中使用访问器,因此o = [s retain];是编码init函数时更常见的用法。

相关问题