在我的一个应用程序中,我正在使用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;
});
答案 0 :(得分:2)
根据documentation on Address Book,您不能跨线程使用ABAddressBookRef
重要:ABAddressBookRef的实例不能被使用 多线程。每个线程必须通过调用创建自己的实例 ABAddressBookCreate。
有关如何执行此操作的更多建议,请参阅this question: