EXC_BAD_ACCESS when adding contacts from Addressbook?

I have the following code :

ABAddressBookRef ab; ab = ABAddressBookCreate(); int len = (int) ABAddressBookGetPersonCount(ab); int i; for(i = 1; i < (len + 1); i++) { ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,(ABRecordID) i); CFStringRef firstName, lastName; firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty); lastName = ABRecordCopyValue(person, kABPersonLastNameProperty); static char* fallback = ""; int fbLength = strlen(fallback); int firstNameLength = fbLength; bool firstNameFallback = true; int lastNameLength = fbLength; bool lastNameFallback = true; if (firstName != NULL) { firstNameLength = (int) CFStringGetLength(firstName); firstNameFallback = false; } if (lastName != NULL) { lastNameLength = (int) CFStringGetLength(lastName); lastNameFallback = false; } if (firstNameLength == 0) { firstNameLength = fbLength; firstNameFallback = true; } if (lastNameLength == 0) { lastNameLength = fbLength; lastNameFallback = true; } firstNameString = malloc(sizeof(char)*(firstNameLength+1)); lastNameString = malloc(sizeof(char)*(lastNameLength+1)); if (firstNameFallback == true) { strcpy(firstNameString, fallback); } else { CFStringGetCString(firstName, firstNameString, 10*CFStringGetLength(firstName), kCFStringEncodingASCII); } if (lastNameFallback == true) { strcpy(lastNameString, fallback); } else { CFStringGetCString(lastName, lastNameString, 10*CFStringGetLength(lastName), kCFStringEncodingASCII); } printf("%d.\t%s %s\n", i, firstNameString, lastNameString); NSString *fname= [NSString stringWithFormat:@"%s",firstNameString]; NSString *lname= [NSString stringWithFormat:@"%s",lastNameString]; [dict setValue:fname forKey:@"fname"]; [dict setValue:lname forKey:@"lname"]; [self.arrname addObject:[dict copy]]; if (firstName != NULL) { CFRelease(firstName); } if (lastName != NULL) { CFRelease(lastName); } free(firstNameString); free(lastNameString); }

it working well for first time.

But When i delete record from contact list and then try to add record my App crase at the following statement.

firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

Can anyone solve this problem ?? Any Idea is greatly appreciated.


There's no guarantee that the valid ABRecordID starts at 1 and ends at ABAddressBookGetPersonCount(addressBook). You <strong>can't</strong> use the for-loop using ABRecordID.

Instead, obtain the CFArray containing all the people using ABAddressBookCopyArrayOfAllPeople and iterate on it.

Another comment is that you shouldn't use C string; most of the things can be done using the API of CFString and NSString, which supports Unicode out of the box. By getting the C string specifying kCFStringEncodingASCII, you're basically destroying letters like é or ü, ગુજરાતી or 案. (Note that CFStringGetCString with kCFStringEncodingASCII is quite picky and removes characters not in the ASCII; it doesn't give you UTF8 representation of the string.) There're many people whose name contains non-ASCII characters. So, please do learn CFString and NSString methods. Note that a CFStringRef and an NSString* can be freely interchanged.

人吐槽 人点赞



用户名: 密码:
验证码: 匿名发表


查看评论:EXC_BAD_ACCESS when adding contacts from Addressbook?