Frage

The code I had been written was working until I tried to move the saving to a new thread. in ViewController.h I assigned an ABAddressBookRef:

ViewController.h

ABAddressBookRef addressBook;

and in ViewController.m file created an addressbook object

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];

and the saveThread method is:

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

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

}

ABAddressBookSave line crashes the app:

Thread 6: EXC_BAD_ACCESS (Code=1,address=0x65504289)

I know the error is because of a memory failure but I can't release anything since I'm using ARC.

War es hilfreich?

Lösung

It appears to be because you cannot share an instance of ABAddressBookRef across multiple threads (see this Why would ABAddressbookRef need to be created for each thread?).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top