gpt4 book ai didi

multithreading - NSIndexPath 线程安全吗?

转载 作者:行者123 更新时间:2023-12-03 16:02:27 25 4
gpt4 key购买 nike

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 实例,试图将自身与已释放的实例进行比较。

最佳答案

到目前为止,我所得到的最佳答案正如我所怀疑的:

从 OS X 10.7 和 iOS 5 开始,NSIndexPath 是线程安全的。在此之前,实例是线程安全的,因为它们是不可变的,但现有实例的共享检索却不是。

对于按需返回索引路径的方法,我这样做了:

- (NSIndexPath *)indexPath;
{
NSIndexPath *result = … // create the path as appropriate

return [[result retain] autorelease];
}

自从实现最后一行代码后,我们就不再收到来自索引路径的崩溃报告。

索引路径由-indexPathByAddingIndex:+indexPathWithIndex:创建。

我看到的结果让我非常确定(10.7/iOS5 之前)这些方法正在返回现有的 NSIndexPath 实例。不过,当前线程不会以任何方式保留该实例,因此首先创建该实例的线程(在我们的例子中是 main )正在释放路径(可能通过弹出自动释放池)并为我们的工作线程留下一个悬空指针,正如问题中所见,使用时会崩溃。

这一切都有点可怕,因为如果我的分析正确的话,我添加的 retain/autorelease 舞蹈只是将一种竞争条件替换为另一种竞争条件,较少 -可能是一个。

在 10.7/iOS5 之前,我只能想到一种真正的解决方法:将所有索引路径的创建限制到主线程。如果此类代码被多次调用,这可能会相当慢,因此可以通过维护自己的某种实例缓存以供后台线程使用来改进(以内存为代价)。如果缓存保留路径,那么您就知道它不会被主线程释放。

关于multithreading - NSIndexPath 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com