EXC_BAD_ACCESS从通讯录添加联系人时?
问题描述:
我有以下代码: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);
任何人都可以解决这个问题吗? 任何想法,不胜感激。
答
无法保证有效的ABRecordID
从1
开始,并在ABAddressBookGetPersonCount(addressBook)
结束。您不能使用for循环使用ABRecordID
。
取而代之,获取包含所有使用ABAddressBookCopyArrayOfAllPeople
的人的CFArray
并对其进行迭代。
另一个意见是,你不应该使用C字符串;大部分的事情可以使用支持Unicode的开箱即用的CFString
和NSString
的API来完成。通过获取指定kCFStringEncodingASCII
的C字符串,基本上可以摧毁诸如é或ü,ગુજરાતી或案的字母。 (请注意,CFStringGetCString
与kCFStringEncodingASCII
相当挑剔并删除不在ASCII中的字符;它不会给出字符串的UTF8表示形式。)许多人的名字中包含非ASCII字符。所以,请确实学习CFString
和NSString
方法。请注意,CFStringRef
和NSString*
可以自由互换。
非常感谢..现在它工作得很好。大... – 2010-11-13 09:38:32