NSObject的保留方法是原子的吗?
例如,当从两个不同的线程保留相同的对象时,它是否承诺保留计数增加了两倍,或者保留计数是否可能只增加一次?
感谢。
答案 0 :(得分:13)
NSObject
以及对象分配和保留计数函数是线程安全的 - 请参阅Appendix A: Thread Safety Summary中的Thread Programming Guide。
编辑:我决定看一下Core Foundation的开源部分。在CFRuntime.c中,__CFDoExternRefOperation()
是负责更新保留计数器的函数。它测试进程是否有多个线程,如果有多个线程,它会在更新保留计数之前获取自旋锁,从而使该操作线程安全。
有趣的是,保留计数不是struct
(类)意义上的对象的属性(或实例变量)。运行时使用保留计数器保持单独的结构。事实上,如果我理解正确,这个结构是一个哈希表数组,并且每个哈希表都有一个自旋锁。这意味着锁是指多个已放置在同一哈希表中的对象,即锁既不是全局的(对于所有实例)也不是每个实例。