自动释放的NSMutableArray未被填充

3
我想要创建一个像这样的数组:
NSMutableArray *array = [self methodThatReturnsAnArray];

在“methodThatReturnsAnArray”方法中,我创建一个数组,如下所示:
NSMutableArray *arrayInMethod = [[NSMutableArray alloc] init];

当我完成填充“arrayInMethod”时,我将返回该数组,并为了防止内存泄漏,使用以下代码:

return [arrayInMethod autorelease];

然而,“array”变量从未被填充。但是,如果删除“autorelease”,它就可以正常工作。我应该怎么做才能确保返回的对象被释放?
+ (NSMutableArray *)buildInstants:(NSArray *)huntsArray {

    NSMutableArray *goGetObjects = [[[NSMutableArray alloc] init] autorelease];

    for (int i = 0; i < [huntsArray count]; i++) {

        NSDictionary *huntDict = [huntsArray objectAtIndex:i];

        PHGoGet *goGet = [[PHGoGet alloc] init];

        goGet.title = [huntDict objectForKey:@"title"];
        goGet.description = [huntDict objectForKey:@"description"];
        goGet.start = [huntDict objectForKey:@"start"];
        goGet.end = [huntDict objectForKey:@"end"];
        goGet.ident = [huntDict objectForKey:@"id"];

        if ((CFNullRef)[huntDict objectForKey:@"image_url"] != kCFNull) {

            goGet.imageURL = [huntDict objectForKey:@"image_url"];

        } else {

            goGet.imageURL = nil;
        }

        if ((CFNullRef)[huntDict objectForKey:@"icon_url"] != kCFNull) {

            goGet.iconURL = [huntDict objectForKey:@"icon_url"];

        } else {

            goGet.iconURL = nil;
        }

        goGet.longitude = [huntDict objectForKey:@"lng"];
        goGet.latitude = [huntDict objectForKey:@"lat"];
        goGet.companyIdent = [huntDict objectForKey:@"company_id"];

        [goGetObjects insertObject:goGet atIndex:i];
        [goGet release];
    }

    return [[goGetObjects copy] autorelease];
}

3
移除autorelease应该不会有任何区别,至少不会立即产生影响。能否将methodThatReturnsAnArray方法中的其余代码发布出来? - kubi
2
你在哪里检查数组是否已填充?是在返回后立即检查还是稍后(可能是从按钮处理程序中)检查? - taskinoor
@kubi 现在我已经添加了一些代码。 - Erik Nolander
1
“-copy”方法返回一个NSArray,但是方法定义将其定义为NSMutableArray。如果您想要返回一个NSMutableArray对象,只需将最后一条语句更改为“return goGetObjects;”。 - Deepak Danduprolu
我没有看到任何问题。你看到了什么错误或不良行为? - kubi
2个回答

1

尝试使用NSMutableArray的便捷方法...将其更改为:

NSMutableArray *arrayInMethod = [[NSMutableArray alloc] init];

关于...

NSMutableArray *arrayInMethod = [NSMutableArray array];

array 会返回一个自动释放的对象。


它们实际上被称为“工厂”方法。 - Alexsander Akers
3
我一直听人们称它们为“便捷方法” :) - sudo rm -rf
2
从技术上讲,它们是工厂方法,但在ObjC世界中没有人称之为这样。 - bbum
GoF 工厂方法:定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法允许一个类将实例化推迟到其子类中... 我认为仅仅分配、初始化、自动释放的方法并不符合这个定义。还有其他类型的工厂方法吗? - Michael Fredrickson
我已经尝试过这个方法,但是没有达到预期的结果。自动释放有问题,无论是内置的还是手动设置的。 - Erik Nolander

1
首先,我建议您不要从任何方法中返回NSMutableArray。最好使用NSArray来避免一些非常难以调试的问题。我的建议是:
您可以声明可变数组并填充它:
NSMutableArray *arrayInMethod = [[[NSMutableArray alloc] init] autorelease];

然后你返回一个自动释放的副本:

return [[arrayInMethod copy] autorelease];

最后,当您获取返回的数组时,如果需要更改它,则将其再次变为可变状态:
NSMutableArray *array = [[self methodThatReturnsAnArray] mutableCopy];

当你完成数组操作后,需要释放它:

[array release];

我在问题中添加了你所做的更改后的方法代码。 - Erik Nolander
Erik,它确实有效。你可以在Stackoverflow上搜索,会发现许多其他解决方法,那只是我的个人解决方案。请描述你遇到的问题,这样我们才能帮助你! - Ruben Marin

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