在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Couchdb 中订购

PayPal 和表单订购 HTML

Pub/Sub 订购和多区域

如何在 Laravel 中订购关系?

如何在 Laravel 中订购关系?

如何在 JBoss 5 中订购 EJB 和 JMS 队列配置的部署?