从一个方法中返回NSMutableArray...我需要在之前释放它吗?- iPhone SDK

4

我一直很困惑如何处理从方法中返回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个回答

9
您的方法的调用者期望得到一个有效的NSArray,但它并不拥有它。如果您像在问题中所做的那样“释放”它,那么您将返回一个无效的对象(因为您既分配了它,又释放了它)。所以这不是您想要的。
在返回之前,您应该将数组“自动释放”。然后您将分配它,但在返回之前放弃所有权(而不是强制释放它)。它将在当前事件循环结束时保持有效,当自动释放池被清理时,您的调用者可以根据需要保留或放弃它:
-(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;
}

4

简短回答 - 不行。

目前的情况是,您在分配数组后释放(释放)它,然后才返回。因此,当您尝试从调用方法访问返回对象时,会导致崩溃。

我的建议是使用autorelease或者如果经常使用该数组对象,则由调用方法或类ivar负责该数组对象。

autorelease的示例:

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

我建议您阅读开发者文档中有关内存管理的文章


1
通常,与其使用alloc/init创建临时数组,建议考虑使用一种方便的创建方法(在这种情况下为+arrayWithCapacity:)。
- (NSArray *)methodToCall
{
    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:10];

    // Fill the array with stuff here

    return mutableArray;
}

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


1
如果你通过调用alloc和init进行显式对象分配,那么你就是该对象的所有者,因此你需要负责其对象保留值,否则如果你使用隐式方式,则不需要关心它。它会自行处理。
-(NSMutableArray *)getArray
{
     NSMutableArray *array=[[NSMutableArray alloc] initWithCapacity:10];

     //your code

    return [array autorelease];
}

在上面的代码中,我们是对象的所有者,因此我们需要通过传递autorelease来处理它的保留计数,autorelease池将会负责它。
-(NSMutableArray *)getArray
{
     NSMutableArray *array=[NSMutableArray allocWithCapacity:10];

     //your code

    return array;
}

在上述代码中,我们并没有分配任何对象,只是调用类方法来定义数组的大小。
如果您想了解更多详情,请查看苹果库中关于内存管理指南中对象所有权的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接