2

我有以下代码:

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

1 回答 1

4

不能保证有效的ABRecordID开始于1和结束于ABAddressBookGetPersonCount(addressBook). 您不能使用 for 循环 using ABRecordID.

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

另一个评论是你不应该使用 C 字符串;大多数事情都可以使用 和 的 API 来完成CFStringNSString它支持开箱即用的 Unicode。通过获取指定的 C 字符串kCFStringEncodingASCII,您基本上是在破坏 é 或 ü、ગુજરાતી 或 案等字母。(请注意,CFStringGetCStringwithkCFStringEncodingASCII非常挑剔,它会删除不在 ASCII 中的字符;它不会为您提供字符串的 UTF8 表示形式。)有很多人的名字包含非 ASCII 字符。所以,请务必学习CFStringNSString方法。注意 aCFStringRef和 anNSString*可以自由互换。

于 2010-11-13T07:53:22.810 回答