2012-03-23 2 views
0

я следующий метод для получения Addressbook контактов:я получаю EXC_BAD_ACCESS при вызове ABAddressBookRemoveRecord

- (void) scanAddressBook 
{ 

NSUInteger i; 
NSUInteger k; 

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *people = (__bridge_transfer NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook); 

if (people==nil) 
{ 
    NSLog(@"NO ADDRESS BOOK ENTRIES TO SCAN"); 
    CFRelease(addressBook); 
    return; 
} 

for (i=0; i<[people count]; i++) 
{ 
    ABRecordRef person = (__bridge ABRecordRef)[people objectAtIndex:i]; 
    NSNumber *recordID = [NSNumber numberWithUnsignedInt:ABRecordGetRecordID(person)]; 

    ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); 
    NSString *name = [NSString stringWithFormat:@"%@ %@", 
         (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty), 
         (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)]; 



    CFIndex phoneNumberCount = ABMultiValueGetCount(phoneNumbers); 
    NSMutableArray *arrPhoneNumbers = [[NSMutableArray alloc] initWithCapacity:phoneNumberCount]; 

    for (k=0; k<phoneNumberCount; k++) 
    { 
     CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex(phoneNumbers, k); 
     NSString *phoneNumberValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, k); 
     CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel(phoneNumberLabel); 


     [arrPhoneNumbers addObject:phoneNumberValue]; 

     CFRelease(phoneNumberLocalizedLabel); 
     CFRelease(phoneNumberLabel); 
    } 

    NSMutableDictionary *dictPerson = [[NSMutableDictionary alloc] init]; 
    [dictPerson setObject:name forKey:@"contactName"]; 
    [dictPerson setObject:arrPhoneNumbers forKey:@"phoneNumbers"]; 
    [dictPerson setObject:recordID forKey:@"recordID"]; 

    [arrABFriends addObject:dictPerson]; 
} 

CFRelease(addressBook); 
} 

Позже, в следующем зрения, у меня есть возможность удалить выбранную запись & это то, как он выглядит как:

-(IBAction) removeContactFromAB 
{ 
ABAddressBookRef addressBook; 
CFErrorRef error = NULL; 
addressBook = ABAddressBookCreate(); // 
CFRetain(addressBook); 
ABRecordID recordID = (ABRecordID)[[personToDump objectForKey:@"recordID"] integerValue]; 
NSLog(@"recordID: %d", recordID); 
// ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,(ABRecordID)recordID); 
ABRecordRef person = ABAddressBookGetGroupWithRecordID(addressBook, recordID); 
//fullName.text = (NSString *)ABRecordCopyCompositeName((ABRecordRef)person); 

ABAddressBookRemoveRecord(addressBook, person, &error); 

if(error !=NULL) 
{ 
    UIAlertView *alert =[[UIAlertView alloc] initWithTitle:@"error" message:@"deleting" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"OK",nil]; 
    [alert show];   
} 

ABAddressBookSave(addressBook, &error); 
NSLog(@"ERROR: %@", &error); 
CFRelease(addressBook); 

} 

Я пытался передать ABRecordRef & ABRecordID к следующему представлению, но в обоих случаях я был EXC_BAD_ACCESS на ABAddressBookRemoveRecord (Addressbook, человек, & ошибка) ,

ответ

1

Проблема заключалась в том, что я пытался получить ссылку из группы с идентификатором из ссылки & Я получаю ноль в качестве ссылки & позже пытается найти запись с эталонным ноль Вот где мое приложение было дать EXC_BAD_ACCESS

Таким образом, вместо:..

ABRecordRef person = ABAddressBookGetGroupWithRecordID(addressBook, recordID); 

там должно быть:

ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, recordID); 
+0

обе строки кода такие же –

+2

@ShreeshGarg Что? Присмотрись! – tipycalFlow

+1

извините мою ошибку –

2

Была ли ваша ABAddressBookGetGroupWithRecordID (адресная книга, recordID) возвращать что-то отличное от нуля?

У меня такая же проблема, я думаю, и проблема где-то вокруг разговора с recordID. Если вы пытаетесь

NSNumber *recordID=[NSNumber numberWithUnsignedInt:ABRecordGetRecordID(person)]; 
ABRecordID recordID2 =(ABRecordID) recordID2; 
ABAddressBookGetGroupWithRecordID(addressBook, recordID2) 

он собирается возвращать нуль, а также. Я не уверен, как это решить.

щ .: Я хотел бы добавить это в комментарии, но оказывается, что я не хватает респ еще :(

+0

Попробуйте изменить эту строку: NSNumber * recordID = [Номер NSNumberWithUnsignedInt: ABRecordGetRecordID (человек)]; к NSString * recordID = [NSString stringWithFormat: @ "% d", ABRecordGetRecordID (человек)]]; где вы инициализируете группы. Он должен решить проблему. – Hooloovoo

+0

Лучшее решение: http://stackoverflow.com/questions/2138923/iphone-addressbook-getting-null-item-in-abaddressbookgetpersonwithrecordid – Hooloovoo

+0

Ну, я прочитал это решение, прежде чем отправил свой вопрос, и это не решило мою проблему. – Kex

Смежные вопросы