自动发布的 NSMutableArray 未填充

Posted

技术标签:

【中文标题】自动发布的 NSMutableArray 未填充【英文标题】:Autoreleased NSMutableArray not populated 【发布时间】:2011-05-12 16:35:50 【问题描述】:

我想填充这样的数组:

NSMutableArray *array = [self methodThatReturnsAnArray];

在“methodThatReturnsAnArray”方法中,我创建了一个这样的数组:

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

当我完成填充“arrayInMethod”时,我将返回数组,为了防止我正在使用的内存泄漏:

return [arrayInMethod 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];

【问题讨论】:

删除autorelease 应该不会有任何区别,至少不会立即生效。你能把剩下的代码发到methodThatReturnsAnArray吗? 你在哪里检查没有填充数组?在返回之后或一段时间后(可能来自按钮处理程序)? @kubi 现在我添加了一些代码 -copy 方法返回一个 NSArray 但方法定义将其定义为 NSMutableArray 但如果您想返回一个 NSMutableArray 对象,您只需将最后一条语句更改为 return goGetObjects; 我看不出有什么问题。您看到了什么错误/不良行为? 【参考方案1】:

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

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

到...

NSMutableArray *arrayInMethod = [NSMutableArray array];

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

【讨论】:

它们实际上被称为“工厂”方法。 我一直听说它们被称为便捷方法。 :) 从技术上讲,它们是工厂方法,但在 ObjC 世界中没有人这么称呼它们。 GoF 工厂方法:定义创建对象的接口,但让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类......我认为简单地分配、初始化、自动释放的方法不符合该定义。还有其他类型的工厂方法吗? 我已经尝试过了,但没有理想的结果。自动释放的东西不起作用,无论是否内置。【参考方案2】:

首先,我建议您不要从任何方法返回 NSMutableArray。最好使用 NSArray 来避免一些非常难以调试的问题。我的提议是:

您声明可变数组并填充它:

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

然后你返回一个自动发布的副本:

return [[arrayInMethod copy] autorelease];

最后,当您获取返回的数组时,您再次使其可变(仅当您需要更改它时):

NSMutableArray *array = [[self methodThatReturnsAnArray] mutableCopy];

当你完成了数组,你释放它:

[array release];

【讨论】:

我添加了方法中的代码以及您对问题的更改 埃里克,它确实有效。您可以在 *** 中搜索,您会发现许多其他解决方法,这只是我个人的解决方案。请公开您遇到的问题,以便我们为您提供帮助!

以上是关于自动发布的 NSMutableArray 未填充的主要内容,如果未能解决你的问题,请参考以下文章

NSMutableArray 仅在填充另一个数组时越界

使用 CoreData 数据库填充 NSMutableArray

NSMutableArray 排序问题

使用 NSMutableArray 中的数据填充 UITableView

为啥这个 NSMutableArray 没有被填充?

用指针填充的 NSMutableArray