【问题标题】:returning autorelease NSString still causes memory leaks返回 autorelease NSString 仍然会导致内存泄漏
【发布时间】:2011-02-01 18:35:29
【问题描述】:

我有一个简单的函数,它在解码后返回一个 NSString。我在整个应用程序中经常使用它,每次我使用它时它似乎都会造成内存泄漏(根据“泄漏”工具)。泄漏告诉我问题出在我分配要返回的 NSString 的位置上,即使我自动释放它。这是函数:

-(NSString *) decodeValue
{
 NSString *newString;
 newString = [self stringByReplacingOccurrencesOfString:@"#" withString:@"$"];
 NSData *stateData = [NSData  dataWithBase64EncodedString:newString];
 NSString *convertState = [[[NSString alloc] initWithData:stateData encoding:NSUTF8StringEncoding] autorelease];
 return convertState;
}

我对 [autorelease] 的理解是它应该以这种方式使用……我想持有对象的时间足够长,以便在我的函数中返回它,然后让对象稍后自动释放。所以我相信我可以通过这样的代码使用这个功能,而无需手动释放任何东西:

NSString *myDecodedString = [myString decodeValue];  

但是这个过程正在报告泄漏,我不明白如何更改它以避免泄漏。我做错了什么?

【问题讨论】:

    标签: iphone memory-management autorelease


    【解决方案1】:

    我认为泄漏会导致您误入歧途。 Leaks 会告诉你被泄漏的对象最初是在哪里分配的,不一定与泄漏的原因相同。这段代码看起来很好 - 可能发生的情况是这个结果被保留在另一个类中,并且从未在那里发布。

    【讨论】:

    • 好的,谢谢。因此,如果我正确理解您和starkhalo,泄漏告诉我的是该对象已在我的函数中分配,即使它设置为自动释放,它也会以某种方式被在某处调用此函数调用的任何代码保留.这是对你所说的话的合理解释吗?
    • 是的!确切地。检查调用它的任何代码,并确保它正在释放返回值,如果它保留它。
    【解决方案2】:

    Jexe 是对的,Leaks 工具不可能知道泄漏在哪里,它所知道的只是创建实例的点,并且在 RunLoop 结束时说对象仍然被保留,这就是为什么它指向分配调用。这仍然是一个很大的帮助,现在您只需要弄清楚还有谁可以访问 convertState 并保留它。

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 2011-10-13
      • 2011-04-18
      • 2021-04-10
      • 2010-10-25
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多