【发布时间】:2012-06-25 14:39:34
【问题描述】:
我在 ARC 下使用 no 自动释放池运行此代码:
- (NSString*) outName {
if (!outName) {
outName = [[NSString alloc] initWithFormat:@"whatever"]; // or stringWithFormat
}
return outName;
}
调试器说它每次都在泄漏 single outName 实例,而没有适当的池。
如果我将代码更改为,则不会发生这种情况
- (NSString*) outName {
if (!outName) {
outName = @"whatever";
}
return outName;
}
这是我做不到的(这个例子显然被简化了)。此外,如果我在调用代码中创建一个自动释放池(我想避免),泄漏消息就会消失。
为什么 ARC 坚持自动释放这个对象,它保存在 strong 属性中?更重要的是,我怎样才能避免这个警告?
【问题讨论】:
-
你为什么会认为它是要求一个自动释放池?
-
ARC 不会删除
retain和release,它只是消除了您使用retain和release的需要。如果没有自动释放池,项目就会泄漏。 (将其移至评论,因为我不确定 100%,如果人们同意评论,我将取消删除我的答案) -
如果这基本上是一个 getter,为什么不简单地返回 outName 让 setter 担心内存管理?
-
@CodaFi 首先:我得到“__NSCFString autoreleased,没有池子 - 只是泄漏”......我当然可以忽略这个,因为它本质上是一个只读实例,但如果持有对象释放,对象确实会被泄露。
-
@JamesWebster 这个答案更适合作为评论,谢谢。我的问题是,为什么 ARC 选择一种自动释放策略,在这种策略中,人类只需返回牢固持有的 ivar 而无需执行
retain] autorelease]。我想答案是“安全”。显然,这样做的方法是objc_retainAutoreleaseReturnValue
标签: ios automatic-ref-counting