【发布时间】:2012-03-02 20:41:49
【问题描述】:
Apple's multithreading docs 不要将NSIndexPath 列为线程安全的!作为一个不可变的类,我通常希望它是线程安全的。
以前,我确信用于声明 NSIndexPath 实例是共享且全局唯一的文档。不过现在这似乎已经消失了,这让我怀疑设计是针对 iOS5 / Mac OS X 10.7 进行了修改。
我在 Mac OS X 10.6 (Snow Leopard) 上看到了很多来自客户的崩溃报告,这些报告似乎在尝试访问索引路径时崩溃了。因此我想知道:实际实例线程安全吗,但是将它们从共享缓存中拉出的逻辑不是吗?有人有什么见解吗?
这是一个示例堆栈跟踪顺便说一句:
Dispatch queue: com.apple.root.default-priority
0 libobjc.A.dylib 0x96513f29 _cache_getImp + 9
1 libobjc.A.dylib 0x965158f0 class_respondsToSelector + 59
2 com.apple.CoreFoundation 0x948bcb49 ___forwarding___ + 761
3 com.apple.CoreFoundation 0x948bc7d2 _CF_forwarding_prep_0 + 50
4 com.apple.Foundation 0x994b10c5 -[NSIndexPath compare:] + 93
5 com.apple.Foundation 0x99415686 _NSCompareObject + 76
6 com.apple.CoreFoundation 0x948af61c __CFSimpleMergeSort + 236
7 com.apple.CoreFoundation 0x948af576 __CFSimpleMergeSort + 70
8 com.apple.CoreFoundation 0x948af38c CFSortIndexes + 252
9 com.apple.CoreFoundation 0x948fe80d CFMergeSortArray + 125
10 com.apple.Foundation 0x994153d3 _sortedObjectsUsingDescriptors + 639
11 com.apple.Foundation 0x994150d8 -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] + 566
对我来说,这是一个 NSIndexPath 实例,它试图将自己与一个已释放的实例进行比较。
【问题讨论】:
-
你如何处理这些索引路径,崩溃发生在哪里?多线程错误很神秘,
NSIndexPath的崩溃并不一定意味着问题出在NSIndexPath。 -
我执行一个获取请求,然后根据他们的
-indexPath方法对结果进行排序。在内部,每次调用该方法时,都会创建一个索引路径,该路径表示对象在树中的位置。我怀疑我收到了共享的NSIndexPaths,然后很快在另一个线程上被释放。 -
NSIndexPath 起源于哪里?它是获取对象的属性吗?
-
我的托管对象上有一个
-indexPath方法。该方法按需计算路径,通过+indexPathWithIndex:和-indexPathByAddingIndex:调用的组合创建它 -
很高兴知道在单线程项目上使用 NSIndexPath 至少应该是安全的。因为我正在考虑自己使用它。否则,一个普通的 C 整数数组可以取代它的 (NSIndexPath) 位置。
标签: multithreading cocoa core-data foundation nsindexpath