2010-03-04 74 views
9

我一直在使用iPhone的通讯录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-SW1iPhone的多线程操作通讯录

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

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

有人可以证实,如果它确实是线程安全的问题(所以@synchronize应该工作)或其他一些问题?

干杯

回答

11

这不是线程安全问题...有没有办法让你用锁解决它。注释使得它非常清楚:

重要:ABAddressBookRef的实例不能由 多个线程中使用。通过调用 ABAddressBookCreate每个线程必须 做出自己的实例。

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

的包装将有一个主线程只做一两件事:从阻塞队列中读取操作请求,然后对地址簿中的操作。你的所有线程都会将它们的操作排队到单个队列中,并且包装器将执行这些操作;如果队列中没有任何内容,则包装将阻塞,直到队列中有某物。

这应该解决的不是被允许从多个线程使用ABAddressBookRef问题。

+0

Hi Lirik, 是的,我得到了同样的结论......它似乎是一个非常糟糕的方式来构建一个诚实的AB框架..开发人员需要构建一个(相对)复杂的多线程解决方案解决一个应该被设计的常见问题,但是我能做什么..我将不得不用大手枪来做这件事,谢谢! – Marco 2010-03-04 22:29:01

+0

其实,在阅读你的答案之前,我已经建立了一个不同的解决方案,在那里我保存了一个ABRefs字典,其中线程名称(天真地)认为iPhone从线程池回收线程......但是,没有骰子......它构建了一个新的线程,每次你分离一个......所以我终于得到了同样的结论 – Marco 2010-03-04 22:32:36

+0

@Lirik和@Marko,我有同样的问题。我已经看到了多线程问题,并且从一开始就实现了AB包装器。但是我仍然有一个巨大的bug - 有时候应用程序会崩溃,有时它会删除AB中的所有联系人。我有tripple - 检查使用AB实例的所有方法从由此包装器管理的线程执行它。 – 2011-01-17 16:11:32