【发布时间】:2023-03-15 09:16:01
【问题描述】:
这是一个自我回答的问题。把它放在那里帮助别人。
我的应用刚刚发生了一次非常有趣的崩溃。我想做的是定义一个排序比较器,它会在模型中返回一个静态方法。
因此,例如,如果我的模型是 Car,并且我想按名称排序,我会在 Car.m:
+ (NSComparator)nameSortAscendingComparator {
NSComparator nameSortAscendingComparator = ^NSComparisonResult(id obj1, id obj2) {
NSString *a = [(Car *)obj1 name];
NSString *b = [(Car *)obj2 name] ;
return [a compare:b] ;
};
}
调用代码如下所示:
NSComparator comparator = [Car nameSortAscendingComparator];
_sortedCars = [cars sortedArrayUsingComparator:comparator];
运行它给出了一个真正的红鲱鱼异常。事实上,它看起来像这样:
断点停止:
Thread 1, Queue : com.apple.main-thread
#0 0x0231fcbc in _objc_empty_vtable ()
#1 0x0280c70a in __56-[NSArray sortedArrayFromRange:options:usingComparator:]_block_invoke_0 ()
#2 0x0273f07d in __CFSimpleMergeSort ()
#3 0x0273f124 in __CFSimpleMergeSort ()
#4 0x0273f008 in CFSortIndexes ()
#5 0x0277ad71 in -[NSArray sortedArrayFromRange:options:usingComparator:] ()
#6 0x0279a2b5 in -[NSArray sortedArrayUsingComparator:] ()
它带我去了各种各样的花园小径。块不能作为静态变量或通过静态方法访问吗?可能是在 initialize 中执行所有这些操作导致了问题?
【问题讨论】:
标签: ios nsarray objective-c-blocks nssortdescriptor