直到我尝试将保存内容移至新线程之前,我编写的代码一直有效。
在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/