直到我尝试将保存内容移至新线程之前,我编写的代码一直有效。
在ViewController.h中,我分配了一个ABAddressBookRef:

ViewController.h

ABAddressBookRef addressBook;

并在ViewController.m文件中创建了一个地址簿对象
ViewController.m
addressBook = ABAddressBookCreateWithOptions(NULL, anError);
/// ... getting a person name and modify it. the code is OK. tested before the NSThread thing
NSThread *saveThread = [[NSThread alloc] initWithTarget:self selector:@selector(saveAddressBook:) object:(__bridge id)addressBook];
[saveThread start];

saveThread方法是:
- (void)saveAddressBook:(id)ab
{
    bool didSave;
    CFErrorRef error = NULL;

    didSave = ABAddressBookSave((__bridge ABAddressBookRef)ab, &error);
    if (didSave) { NSLog(@"Saved.");}

}

ABAddressBookSave行使应用程序崩溃:

线程6:EXC_BAD_ACCESS(代码= 1,地址= 0x65504289)

我知道错误是由于内存故障引起的,但是由于使用了ARC,所以无法释放任何内容。

最佳答案

似乎是因为您不能在多个线程之间共享ABAddressBookRef的实例(请参阅此Why would ABAddressbookRef need to be created for each thread?)。

关于ios - ABAddressBookSave导致启用EXC_BAD_ACCESS ARC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20431941/

10-10 19:59