代码:
- (void) foo : (NSString*) ori_string
{
her_string = [ori_string copy];
while ([her_string length]>0)
{
her_string = [her_string substringFromIndex:1];
//do something...
}
[her_string release]; //Here is the problem
}
大家好,
如果我像上面那样释放 her_string
,分析器会说这是调用者此时不拥有的对象的引用计数的不正确减少
。
否则如果我不释放它,它说这是一个潜在的内存泄漏。
我应该在哪里以及如何发布它?谢谢你!
最佳答案
删除[her_string release]
行,并将autorelease
添加到copy
。
- (void) foo : (NSString*) ori_string
{
her_string = [[ori_string copy] autorelease];
while ([her_string length]>0)
{
her_string = [her_string substringFromIndex:1];
//do something...
}
}
问题在于 copy
返回一个必须释放的字符串,而您通过调用 substringFromIndex
覆盖该字符串而丢失了对它的引用。丢失引用后,它永远无法正确释放,因此字符串的第一个复制版本会泄漏(如果 length > 0
,否则您的代码会正确释放字符串)。
substringFromIndex
返回一个已经自动释放的字符串,因此您不必担心它,直到您希望该字符串在当前自动释放池之外保留。
关于objective-c - 我应该如何正确释放这个 NSString ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530849/