2012-03-23 55 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