2012-03-23 63 views
0

時得到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(地址簿,人,&錯誤) 。

回答

1

的問題是,我試圖從參考&檢索一組的ID參考我得到零作爲參考&後試圖找到與參考零記錄這就是我的應用程序是給EXC_BAD_ACCESS

因此,而不是:。

ABRecordRef person = ABAddressBookGetGroupWithRecordID(addressBook, recordID); 

應該有:

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

兩行代碼都一樣 – 2013-02-02 12:03:32

+2

@ShreeshGarg什麼?仔細觀察! – tipycalFlow 2013-05-16 15:47:34

+1

對不起我的錯誤 – 2013-05-25 12:53:25

2

您的ABAddressBookGetGroupWithRecordID(addressBook,recordID)是否返回非null值?

我有同樣的問題,我認爲和問題是在recordID的對話周圍的某處。 如果您嘗試

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

它也將返回null。 我不知道如何解決這個問題。

UI:我想在註釋添加這一點,但事實證明我沒有足夠的代表尚未:(

+0

嘗試更改此行:NSNumber * recordID = [NSNumber numberWithUnsignedInt:ABRecordGetRecordID(person)];到NSString * recordID = [NSString stringWithFormat:@「%d」,ABRecordGetRecordID(person)]];你在哪裏初始化組。它應該解決問題。 – Hooloovoo 2012-03-27 09:09:21

+0

一個更好的解決方案:http://stackoverflow.com/questions/2138923/iphone-addressbook-getting-null-item-in-abaddressbookgetpersonwithrecordid – Hooloovoo 2012-03-27 09:24:25

+0

嗯,我讀了解決方案之前,我張貼我的&它沒有解決我的問題.. – Kex 2012-05-23 17:29:26