3

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

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

4

2 回答 2

5

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

于 2010-03-28T16:07:03.167 回答
0

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

于 2010-03-28T17:03:16.607 回答