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; 也就是说,o并s指向同一个对象.永远不会调用合成的访问器; 你可以完全摆脱@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函数时更常见的用法.
| 归档时间: |
|
| 查看次数: |
842 次 |
| 最近记录: |