我使用iPhone的AddressBook接口已经有一段时间了。但是为了提高应用程序性能,我决定“重用”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应该可以工作)还是其他问题?
干杯
发布于 2010-03-05 06:01:32
这不是线程安全问题...你没有办法用锁来解决这个问题。评论很清楚地表明:
重要:ABAddressBookRef实例不能由多个线程使用。每个线程必须通过调用ABAddressBookCreate来创建自己的实例。
您可以做的是创建ABAddressBook的单个实例,并创建一个生产者/消费者体系结构来管理对对象的访问。
包装器将有一个主线程,它只做一件事:从阻塞队列读取操作请求,然后在地址簿上执行操作。所有线程都会将它们的操作排队到单个队列中,包装器将执行这些操作;如果队列中没有任何操作,则包装器将阻塞,直到队列中有东西为止。
这应该解决了不允许从多个线程使用ABAddressBookRef的问题。
https://stackoverflow.com/questions/2382388
复制相似问题