EXC_BAD_ACCESS при выполнении ABAddressBookSave! - PullRequest
2 голосов
/ 22 марта 2010

Я пытаюсь создать новый контакт и добавить его в адресную книгу, но когда я попадаю в строку кода ABAddressSave, я получаю EXC_BAD_ACCESS. Я не вижу, что я делаю неправильно, я включил NSZombie, чтобы проверить, не связана ли это с ошибкой памяти, но не обнаружила ее. Кто-нибудь может сказать мне, что не так с этим кодом? Заранее спасибо!

    CFErrorRef error = NULL;

 ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();

 ABRecordRef newRecord = ABPersonCreate();

 ABRecordSetValue(newRecord, kABPersonFirstNameProperty, @"Xxxxxx", &error);

 ABRecordSetValue(newRecord, kABPersonURLProperty,  @"Yyyyyy", &error);


 //Add phone numbers to record

 ABMutableMultiValueRef phones = ABMultiValueCreateMutable(kABMultiStringPropertyType);
 ABMultiValueAddValueAndLabel(phones, @"1-555-555-5555", kABWorkLabel, NULL);


 ABRecordSetValue(newRecord, kABPersonPhoneProperty, phones, &error);

 CFRelease(phones);

 //Add email address to record

 ABMutableMultiValueRef emails = ABMultiValueCreateMutable(kABMultiStringPropertyType);
 ABMultiValueAddValueAndLabel(emails, @"xxx_xxx@yahoo.com", kABWorkLabel, NULL);


 ABRecordSetValue(newRecord, kABPersonEmailProperty, emails, &error);

 CFRelease(emails);

 ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

 NSMutableDictionary *addressDict = [[NSMutableDictionary alloc] init];

 [addressDict setObject:@"xxx1" forKey:(NSString *)kABPersonAddressStreetKey];
 [addressDict setObject:@"xxx2" forKey:(NSString *)kABPersonAddressCityKey];
 [addressDict setObject:@"xxx3" forKey:(NSString *)kABPersonAddressStateKey];
 [addressDict setObject:@"xxx4" forKey:(NSString *)kABPersonAddressZIPKey];

 ABMultiValueAddValueAndLabel(multiAddress, addressDict,  kABWorkLabel, NULL);


 ABRecordSetValue(newRecord, kABPersonAddressProperty, multiAddress, &error);

 CFRelease(multiAddress);
 [addressDict release];


 ABAddressBookAddRecord(iPhoneAddressBook, newRecord, &error);
 ABAddressBookSave(iPhoneAddressBook, NULL);

 if(error != nil){
  NSLog(@"Error creating contact:%@", error);
 }

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Хорошо, я понял, что это не проблема с памятью, на самом деле ошибка даже не в опубликованном коде, потому что, когда я отправлял код, я немного его очистил и ошибки больше нет Вроде глупо, но я сделал это. Итак, ошибка: когда я назначал значение URL, я назначал его с помощью простого вызова ABRecordSetValue, и я должен был использовать ABMutableMultiValueRef. Кроме того, каждый раз, когда я заполнял запись значением nil, у меня возникал сбой, поэтому я думаю, что nil-значения недопустимы при создании объекта Person. Спасибо, что уделили время!

1 голос
/ 22 марта 2010

Я бы предложил запустить ваш код в Instruments с шаблоном Memory-> Object Allocations. Он должен очень быстро показать, какой объект является проблемой, и какое освобождение памяти вызывает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...