ios - 启用 ARC 时,NSComparator 在对 NSArray 进行排序时更改行为

标签 ios objective-c sorting automatic-ref-counting comparator

我正在使用 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/

相关文章:

ios - 镜像 UIView

ios - iOS 6 上未配置 iCloud 状态

xcode 6 beta 6 sort() 似乎不像 Swift 文档所说的那样工作

IE 8 的 jquery 表排序和 css 修复

iphone - 如何在 objective-c 中调用此方法

ios - 无法触摸 UIScrollView 中的 UIButton

objective-c - 如何配置 xCode 4 以在不添加 '.mm' 文件的情况下编译 objective-c++

ios - 为什么我的 Tabbar 的用户交互在从 popviewcontroller 到另一个 View 时启用?

javascript - 为什么使用 < 和 > 对排序功能没有影响?

ios - 如何重用属性