2010-03-04 73 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