代码:
- (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
,分析师会说it's an incorrect decrement of the reference count of an object that is not owned at this point by the caller
。
否则,如果我不释放它,它会说这是一个潜在的内存泄漏。
我应该在何处以及如何发布它?谢谢!
答案 0 :(得分:10)
删除[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
返回一个已经自动释放的字符串,因此在您希望字符串在当前自动释放池之外保留之前,您不必担心它。
答案 1 :(得分:-2)
您不必释放[NSString copy]返回的NSString 您只释放由[[XXXX alloc] init]
创建的对象IOS 5使用ARC,如果您使用ARC,您永远不必担心何时发布或保留