自动发布的 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 未填充的主要内容,如果未能解决你的问题,请参考以下文章
使用 CoreData 数据库填充 NSMutableArray