1

在我的一个应用程序中,我使用了 dispatch_queue,在其中我声明了一个dispatch_asyc用于检查地址簿的队列。现在,当编译器到达 return 语句时,它会导致应用程序崩溃。下面是我的源代码。

   dispatch_queue_t queue = dispatch_queue_create("abc", NULL);

   dispatch_async(queue, ^{
       // Request authorization to Address Book
       ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
       if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
           ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
               // First time access has been granted...

               // All good.
               completionBlock?completionBlock(YES):nil;

               dispatch_async(queue, ^{
                   if (addressBookRef) {
                       CFRelease(addressBookRef);
                   };
               });

               return;
           });
4

1 回答 1

2

根据Address Book 上的文档,您不能跨线程使用 ABAddressBookRef

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

有关如何执行此操作的更多想法,请参阅此问题:

于 2013-05-03T17:17:43.723 回答