2010-11-13 55 views
2

我有以下代码:EXC_BAD_ACCESS从通讯录添加联系人时?

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); 

} 

它第一次运作良好。

但是,当我从联系人列表中删除记录,然后尝试在以下语句中添加记录我的应用程序清除。

firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty); 

任何人都可以解决这个问题吗? 任何想法,不胜感激。

回答

4

无法保证有效的ABRecordID1开始,并在ABAddressBookGetPersonCount(addressBook)结束。您不能使用for循环使用ABRecordID

取而代之,获取包含所有使用ABAddressBookCopyArrayOfAllPeople的人的CFArray并对其进行迭代。

另一个意见是,你不应该使用C字符串;大部分的事情可以使用支持Unicode的开箱即用的CFStringNSString的API来完成。通过获取指定kCFStringEncodingASCII的C字符串,基本上可以摧毁诸如é或ü,ગુજરાતી或案的字母。 (请注意,CFStringGetCStringkCFStringEncodingASCII相当挑剔并删除不在ASCII中的字符;它不会给出字符串的UTF8表示形式。)许多人的名字中包含非ASCII字符。所以,请确实学习CFStringNSString方法。请注意,CFStringRefNSString*可以自由互换。

+0

非常感谢..现在它工作得很好。大... – 2010-11-13 09:38:32

相关问题