我正在使用 NSComparator 对 NSArray 中的对象进行排序。当代码未启用 ARC 时,比较器会给出与代码启用 ARC 时不同的结果。
以下是我的代码片段:
- (NSArray *)sortedToolsInfoArrayWithKey {
NSArray *aReturnVal = nil;
NSArray *aToolsInfoArray = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ToolsData" ofType:@"plist"]];
aReturnVal = [aToolsInfoArray sortedArrayUsingComparator:(NSComparator)^(NSDictionary *a, NSDictionary *b) {
[[a valueForKey:@"selectionCount"] compare:[b valueForKey:@"selectionCount"]];
}];
[aToolsInfoArray release];
return aReturnVal;
同样的方法是用非 ARC 代码编写的,我需要相同类型的排序数组,请注意,我的要求是我需要对从两个不同文件中的相同 pList 文件中选取的相同数组进行排序,其中一个文件启用了 ARC 而其他文件未启用 ARC。 但是当我这样做时,我得到的排序顺序完全相反,当我禁用 ARC 时,问题就解决了。
我无法理解 NSComparator 在 ARC 和非 ARC 启用文件中对数组进行排序的不同行为背后的逻辑。
谢谢..
最佳答案
您不返回
比较器 block 中的值:
aReturnVal = [aToolsInfoArray sortedArrayUsingComparator:^(id a, id b) {
NSDictionary *adict = (NSDictionary *)a;
NSDictionary *bdict = (NSDictionary *)b;
return [[adict objectForKey:@"selectionCount"] compare:[bdict objectForKey:@"selectionCount"]];
}];
(加上使用 objectForKey
而不是 valueForKey
,后者是 KVC 访问器)。
编辑 错过了您使用的 block 语法也不正确(感谢@Ivan Genchev)。
关于ios - 启用 ARC 时,NSComparator 在对 NSArray 进行排序时更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21460375/