【问题标题】:How am I meant to release an array returned from a class method?我如何释放从类方法返回的数组?
【发布时间】:2011-06-11 23:55:50
【问题描述】:

我的代码中有一段调用返回 NSMutableArray 的方法,如下所示:

+(NSMutableArray *)method {

NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil];

    return rgb;

}

每次调用它都会给我一个泄漏。将[rgb release]; 放在return 之后似乎不起作用。将它放在return 之前会使我的应用程序崩溃。同时输入autorelease 会使我的应用程序崩溃。有什么建议吗?

【问题讨论】:

    标签: objective-c ios cocoa-touch memory-management memory-leaks


    【解决方案1】:
    +(NSMutableArray *)method {
        NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil];
        return [rgb autorelease];
    }
    

    或者:

    +(NSMutableArray *)method {
        NSMutableArray *rgb = [NSMutableArray arrayWithObjects:....., nil];
        return rgb;
    }
    

    如果这仍然崩溃,那么问题很可能在该方法之外,而不是在该方法之内。

    【讨论】:

    • 这两个都会导致崩溃。不确定解决方案是什么。它只是不会让我在任何地方释放阵列而不会引起问题。还有其他可能的解决方案吗?要么就是这样,要么有泄漏的对象,如您所知,这也不是一种选择。
    • 我认为您泄漏的不是数组本身,而是其中的一些对象。
    • 这是完整的数组:NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:redInt],[NSNumber numberWithInt:greenInt],[NSNumber numberWithInt:blueInt], nil];
    • 这绝对没问题。正如我所说,这很可能是方法之外的问题。你有没有机会做这样的事情[[yourClass method] autorelease];? (这会将数组添加到自动释放池两次)
    • 也许你正在释放那些对象。
    【解决方案2】:

    但这每次都会让我泄密 它被称为。放一个[rgb release]; 返回后似乎不起作用。 把它放在返回之前使我的应用程序 碰撞。还放了一个自动释放 使我的应用程序崩溃。有什么建议吗?

    您需要阅读Cocoa Memory Management Guidelines。很清楚,这样的方法必须自动释放返回的对象:

    +(NSMutableArray *)method {
        NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil];
    
        return [rgb autorelease];
    }
    

    或者,或者:

    +(NSMutableArray *)method {
        NSMutableArray *rgb = [NSMutableArray arrayWithObjects:....., nil];
    
        return rgb;
    }
    

    过度保留(例如在您的代码中)不会导致崩溃(至少在内存不足之前不会)。如果发生崩溃,很可能是因为您在其他方面管理不善。

    尝试使用构建和分析并修复它发现的所有问题。如果它仍然崩溃,如果您无法找出原因,请发布崩溃的回溯。

    【讨论】:

    • 我尝试了这两种方法,但它给了我一个糟糕的访问崩溃,导致我进入 main.m。
    • 是的——这并不奇怪——你在其他地方有一个错误。我展示的两个实现是正确的。您可能会在其他地方过度释放该对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2010-11-18
    • 2021-11-25
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多