我一直在使用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应该可行)或其他一些问题?
干杯
答案 0 :(得分:11)
这不是一个线程安全问题......没有办法让你用锁来解决它。评论非常清楚:
重要:ABAddressBookRef的实例不能被使用 多线程。每个线程必须 通过调用创建自己的实例 ABAddressBookCreate。
您可以做的是创建ABAddressBook的单个实例,并创建一个生产者/消费者体系结构来管理对象的访问。
包装器将有一个主线程,只执行一项操作:从阻塞队列中读取操作请求,然后对通讯簿执行操作。所有线程都将其操作排入单个队列,包装器将执行这些操作;如果队列中没有任何内容,那么包装器将阻塞,直到队列中有东西为止。
这应解决不允许使用多个线程中的ABAddressBookRef
的问题。