【问题标题】:how should I release this NSString correctly?我应该如何正确释放这个 NSString?
【发布时间】:2011-12-16 07:01:14
【问题描述】:

代码:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    删除[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 返回一个已经自动释放的字符串,因此在您希望字符串在当前自动释放池之外持续存在之前,您不必担心它。

    【讨论】:

    • 我完全明白了。谢谢迈克尔!
    【解决方案2】:

    您不必释放 [NSString 复制] 返回的 NSString 你只释放由 [[XXXX alloc] init]

    创建的对象

    IOS 5 使用 ARC,如果使用 ARC,您永远不必担心何时发布或保留

    【讨论】:

    • 如果您不使用 ARC(我们需要根据问题假设),那么必须发布一份副本。记住 NARC;新建、分配、保留、复制。必须释放所有这四个。
    猜你喜欢
    • 2011-04-27
    • 2010-12-03
    • 2023-03-03
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-07-04
    • 2011-09-15
    相关资源
    最近更新 更多