【问题标题】:Autoreleased NSMutableArray not populated自动发布的 NSMutableArray 未填充
【发布时间】: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;
  • 我看不出有什么问题。您看到了什么错误/不良行为?

标签: iphone objective-c nsmutablearray return autorelease


【解决方案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];

【讨论】:

  • 我添加了方法中的代码以及您对问题的更改
  • 埃里克,它确实有效。您可以在 Stackoverflow 中搜索,您会发现许多其他解决方法,这只是我个人的解决方案。请公开您遇到的问题,以便我们为您提供帮助!
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多