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

Dev*_*Dev 4 iphone memory-management objective-c 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
Run Code Online (Sandbox Code Playgroud)

BJ *_*mer 12

它不是双重保留; s只保留一次.

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

o = [s retain];
Run Code Online (Sandbox Code Playgroud)

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

如果该行是:

self.o = [s retain];
Run Code Online (Sandbox Code Playgroud)

或者等价的

[self setO:[s retain]];
Run Code Online (Sandbox Code Playgroud)

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