9

一段时间以来,我一直在使用 iPhone 的 AddressBook api。但是进行一些重构以提高应用程序性能我决定“重用”由 AddressBookCreate 返回的 ABAddressBookRef,因为我注意到这样做有很大的性能改进。但是,我现在随机收到 EXEC_BAD_ACCESS 错误,我认为原因在于 iPhone 参考实现中的这个“警告”:http: //developer.apple.com/iphone/library/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/300 -BasicObjects/BasicObjects.html#//apple_ref/doc/uid/TP40007744-CH3-SW1

重要提示:ABAddressBookRef 的实例不能被多个线程使用。每个线程必须通过调用 ABAddressBookCreate 创建自己的实例。

现在,我认为这只是意味着它不是线程安全的,所以我必须同步对 API 的访问,但也许我错了,还有其他一些原因,多线程搞乱了数据结构?

有人可以确认它是否确实是线程安全问题(所以 @synchronize 应该可以工作)还是其他问题?

干杯

4

1 回答 1

11

这不是线程安全问题......你无法用锁来解决它。评论说得很清楚:

重要提示:ABAddressBookRef 的实例不能被多个线程使用。每个线程必须通过调用 ABAddressBookCreate 创建自己的实例。

您可以做的是创建 ABAddressBook 的单个实例并创建一个生产者/消费者架构来管理对对象的访问。

包装器将有一个主线程,它只做一件事:从阻塞队列中读取操作请求,然后在地址簿上执行操作。您的所有线程都将它们的操作排队到单个队列中,并且包装器将执行这些操作;如果队列中没有任何东西,那么包装器将阻塞,直到队列中有东西。

这应该解决不允许使用ABAddressBookRef来自多个线程的问题。

于 2010-03-04T22:01:31.917 回答