给定以下属性定义:
@property (nonatomic,retain) MyObject* foo;
下面的代码是否会导致内存泄漏:
self.foo = [[MyObject alloc] init];
?
看起来 alloc 调用将对象的保留计数递增到 1,然后属性 setter 中的 retain 将其递增到 1。但是由于初始计数永远不会递减到 0,即使在 self被释放。该分析是否正确?
如果是这样,看来我有两个选择:
self.foo = [[[MyObject alloc] init] autorelease];
出于性能原因,不推荐在 iPhone 上使用,或者:
MyObject* x = [[MyObject alloc] init];
self.foo = x
[x release];
这有点麻烦。还有其他选择吗?
最佳答案
Are there any alternatives?
没有。
如果不使用自动释放,您将无法编写大部分 iPhone 应用程序,而 Cocoa Touch 库在许多地方都使用它们。了解它在做什么(将指针添加到列表以在下一帧删除)并避免在紧密循环中使用它。
您可以在 MyObject 上使用类方法为您执行 alloc/init/autorelease 来清理它。
+ (MyObject *)object {
return [[[MyObject alloc] init] autorelease];
}
self.foo = [MyObject object];
关于Objective-C 属性和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292880/