我应该如何正确释放这个NSString?

时间:2011-12-16 07:01:15

标签: objective-c memory-management nsstring release-management

代码:

- (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

否则,如果我不释放它,它会说这是一个潜在的内存泄漏。

我应该在何处以及如何发布它?谢谢!

2 个答案:

答案 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,您永远不必担心何时发布或保留