Я использовал AddressBook api iPhone в течение некоторого времени теперь. Но делая некоторый рефакторинг для улучшения производительности приложения я решил "снова использовать" ABAddressBookRef, возвращенный AddressBookCreate, потому что я заметил, что существуют большие повышения производительности, делающие это. Однако я получаю ошибки 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 должен работать), или некоторая другая проблема?
Аплодисменты
Это не проблема безопасности потоков ... у вас нет способа решить ее с помощью блокировок. Комментарий проясняет это:
Важно : Экземпляры ABAddressBookRef не могут использоваться несколькими потоками. Каждый поток должен создать свой собственный экземпляр, вызвав ABAddressBookCreate.
Что вы можете сделать, так это создать единственный экземпляр ABAddressBook и создать архитектуру производителя / потребителя, которая будет управлять доступом к объекту.
Оболочка будет иметь основной поток, который делает только одно: считывает запросы операций из очереди блокировки, а затем выполняет операции с адресной книгой. Все ваши потоки будут помещать свои операции в единую очередь, и оболочка выполнит эти действия; если в очереди ничего нет, оболочка будет блокироваться до тех пор, пока что-то в очереди не будет.
Это должно решить проблему запрета на использование ABAddressBookRef
из нескольких потоков.