从方法中返回NSMutableArray ...我之前是否发布它? - iPhone SDK

时间:2010-10-14 00:43:59

标签: iphone objective-c

当我需要从方法返回时,我对如何处理NSMutableArray的释放非常困惑。我甚至不确定我是否想要释放它。

我有代码:

-(NSArray *)methodToCall {

        NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10];

        //Fill the array with stuff here

        [mutArray release];  //Am I suppose to have this to keep the memory down?
        return mutArray;
}

我的问题是我是否假设代码中有[mutArray release];。有人可以解释一下吗?我很茫然,我希望尽可能保持我的代码干净无泄漏。

4 个答案:

答案 0 :(得分:9)

您的方法的调用者将期望有效的NSArray,但它不拥有。

如果你release就像你在问题中所做的那样,那么你将返回一个无效的对象(因为你已经分配并释放了它。)所以这不是你想要的。

你应该在返回之前“自动释放”数组。然后你将分配它,但在返回之前放弃所有权(不强行释放它)。当自动释放池被清理时,它将在当前事件循环结束时有效,并且您的调用者可以保留它或者让它适当地运行:

-(NSArray *)methodToCall {

    NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10];

    //Fill the array with stuff here

    return [mutArray autorelease];
}

您的另一种选择,因为您不需要保留参考,或者首先使用“自动释放”便捷方法之一来创建它:

-(NSArray *)methodToCall {

    // We're not doing an explicit alloc/init here, so...
    NSMutableArray *mutArray = [NSMutableArray arrayWithCapacity:10];

    // ...no autorelease necessary.
    return mutArray;
}

答案 1 :(得分:4)

简短回答 - 否。

就像现在一样,你正在分配一个数组,然后在返回之前释放(释放)它。因此,当您尝试从调用方法访问返回对象时,您将会崩溃。

我的建议是使用autorelease或者让调用方法或类ivar负责这个数组对象(如果经常使用它)。

autorelease的一个例子:

NSMutableArray *mutArray = [[[NSMutableArray alloc] initWithCapacity:10] autorelease];

我还建议您阅读开发者文档中的Memory Management

答案 2 :(得分:1)

通常,不要使用alloc / init来创建临时数组,而应考虑使用便利创建方法(在这种情况下为+arrayWithCapacity:):

- (NSArray *)methodToCall
{
    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:10];

    // Fill the array with stuff here

    return mutableArray;
}

+arrayWithCapacity:等便捷创建方法返回调用者不负责的对象,从而减轻了调用内存管理负担的代码。由于调用代码只是返回引用而不是存储它,这将简化事情。

答案 3 :(得分:1)

如果你通过调用alloc和init来进行显式对象分配,那么你就是对象的所有者,所以你负责它的对象保留值,否则你通过隐式做到这一点你不需要关心它。它将照顾好自己。

-(NSMutableArray *)getArray
{
     NSMutableArray *array=[[NSMutableArray alloc] initWithCapacity:10];

     //your code

    return [array autorelease];
}

在上面的代码中我们是对象的所有者,所以我们需要通过autorelease来处理它的保留计数,autoreleasepool会处理它。

-(NSMutableArray *)getArray
{
     NSMutableArray *array=[NSMutableArray allocWithCapacity:10];

     //your code

    return array;
}

在上面的代码中我们没有分配任何对象,我们只是调用类方法来定义数组的大小。

如果您想了解更多详细信息,请访问Apple库中的object ownership in Memory management guide