在 Objective-C 中订购和发布 NSArray
Posted
技术标签:
【中文标题】在 Objective-C 中订购和发布 NSArray【英文标题】:Order and release NSArray in Objective-C 【发布时间】:2011-04-06 11:06:51 【问题描述】:我正在尝试对一系列国家/地区进行排序。这种方式有效,但我无法弄清楚释放tmpArray的方式。我如何释放它,有没有更好的方法来做到这一点?
// PUT COUNTRIES IN ARRAY
NSString *myFile = [[NSBundle mainBundle] pathForResource:@"Countries" ofType:@"plist"];
NSArray *tmpArray = [[NSArray alloc] initWithContentsOfFile:myFile];
tmpArray = [tmpArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
arrayCountries = [[NSArray alloc] initWithArray:tmpArray] ;
// [tmpArray release];
【问题讨论】:
【参考方案1】:-autorelease
是您分配/初始化的那个(因为当您用排序后的数组替换它时会丢失对它的引用)或使用另一个变量,例如“sortedTmpArray
”。
您当前正在做的是“创建此对象并将其分配给tmpArray
”,然后“通过过滤此数组创建另一个数组并将其分配给tmpArray
”。此时,您不再拥有指向您创建的第一个数组的指针,因此无法释放它 - 它已泄露。
解决方案是在创建时将其放入自动释放池中,或者仅使用两个单独的指针。或者,您可以在第一次创建一个可变数组并使用-sortUsingDescriptors:
对其进行排序,而不是创建两个单独的数组。
【讨论】:
谢谢!我把 NSArray *tmpArray = [[[NSArray alloc] initWithContentsOfFile:myFile] autorelease];现在我在分析器中没有收到任何警告。谢谢约书亚。 当然。 “arrayCountries”是一个实例变量吗?如果是这样,您可以通过将排序结果直接分配给 arrayCountires 来缩短它:arrayCountries = [[tmpArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] retain]; ...需要保留,因为 -sortedArrayUsingSelector: 返回一个自动释放的数组。 酷。我首先尝试了这种方式,但没有保留。这样它就可以正常工作并且看起来更好。再次感谢!以上是关于在 Objective-C 中订购和发布 NSArray的主要内容,如果未能解决你的问题,请参考以下文章