给出以下属性定义:
@property (nonatomic,retain) MyObject* foo;
以下代码是否会导致内存泄漏:
self.foo = [[MyObject alloc] init];
?
看起来 alloc 调用将对象上的保留计数增加到 1,然后属性设置器内的保留将其增加到 1。但由于初始计数永远不会减少到 0,因此即使释放 self,对象也会保留下来。这样的分析正确吗?
如果是这样,看起来我有两个选择:
self.foo = [[[MyObject alloc] init] autorelease];
出于性能原因,不建议在 iPhone 上这样做,或者:
MyObject* x = [[MyObject alloc] init];
self.foo = x
[x release];
这有点麻烦。还有其他选择吗?
还有其他选择吗?
No.
如果不使用 autorelease,您将无法编写大部分 iPhone 应用程序,Cocoa Touch 库在很多地方都使用它们。了解它正在做什么(将指针添加到列表中以便在下一帧中删除)并避免在紧密循环中使用它。
您可以使用 MyObject 上的类方法来执行 alloc/init/autorelease 来清理它。
+ (MyObject *)object {
return [[[MyObject alloc] init] autorelease];
}
self.foo = [MyObject object];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)