返回自动释放NSString仍会导致内存泄漏

时间:2010-03-28 16:00:10

标签: iphone memory-management autorelease

我有一个简单的函数,在解码后返回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];  

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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