iPhone多线程AddressBook操作

时间:2010-03-04 20:10:56

标签: iphone multithreading addressbook

我一直在使用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应该可行)或其他一些问题?

干杯

1 个答案:

答案 0 :(得分:11)

这不是一个线程安全问题......没有办法让你用锁来解决它。评论非常清楚:

  

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

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

包装器将有一个主线程,只执行一项操作:从阻塞队列中读取操作请求,然后对通讯簿执行操作。所有线程都将其操作排入单个队列,包装器将执行这些操作;如果队列中没有任何内容,那么包装器将阻塞,直到队列中有东西为止。

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