У меня возникла небольшая проблема с использованием адресной книги для получения имен контактов с устройства в моем собственном представлении контактов в моем приложении.
Код, который у меня есть, отлично работает на эмуляторе, но при тестировании на iPhone 4 он вылетает, приложение работает нормально, если есть два или меньше контактов, но 3 или более, и приложение вылетает.
Вот код, который я использую для получения имен контактов в массиве.
ABAddressBookRef addressBook;
bool wantToSaveChanges = YES;
bool didSave;
CFErrorRef error = NULL;
addressBook = ABAddressBookCreate();
listOfContacts = [[NSMutableArray alloc]init];
int i;
int len = (int) ABAddressBookGetPersonCount(addressBook);
for(i = 1; i< (len+1); i++){
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID) i);
NSString* name = (NSString *)ABRecordCopyCompositeName(person);
ABMultiValueRef number = (NSString *)ABRecordCopyValue(person,kABPersonPhoneProperty);
NSString *mobileNum = (NSString *)ABMultiValueCopyValueAtIndex(number, 0 );
NSLog(@"Name = %@", name);
NSLog(@"Number = %@", mobileNum);
[listOfContacts addObject:name];
[name release];
[mobileNum release];
}
if(ABAddressBookHasUnsavedChanges(addressBook)){
if(wantToSaveChanges){
didSave = ABAddressBookSave(addressBook, &error);
if(!didSave){
//Error
}
}
else{
ABAddressBookRevert(addressBook);
}
}
Когда он падает, это строка, которая выделяется в Xcode:
NSString* name = (NSString *)ABRecordCopyCompositeName(person);
И ошибка гласит:
Thread 1: Program received signal: "EXC_BAD_ACCESS"
Кто-нибудь может увидеть, в чем проблема? Я не понимаю, почему это будет работать на эмуляторе, но не на устройстве? А также почему работает до двух контактов, а не 3 и более??