kABPersonAddressProperty导致ABAddressBookGetPersonWithRecordID下的崩溃

时间:2010-08-06 21:09:59

标签: iphone addressbook

我正在尝试成为一个ABRecordRef,代表来自地址簿的人的联系信息。我构建了两个调用函数的函数,用ABRecordRef中的信息填充个人数据结构。

这里有三个函数的函数声明:

+ (NSMutableArray*) getAllContactProfiles{

    NSMutableArray *listOfProfile = [[NSMutableArray alloc] init];

    //---get the contact information for the api
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex numberOfPeopleInAddressBook = ABAddressBookGetPersonCount(addressBook);

    //<- Here I loop through all the contacts and pass the ABRecordRef into the following function

    //---release the variables---
    CFRelease(addressBook);
    CFRelease(people);
    [listOfProfile autorelease];

    return listOfProfile;
}

以下功能

+ (MSProfileEntry*) getPersonProfileThroughABRecordRef:(ABRecordRef) person{

    MSProfileEntry *mockProfile;
    ABRecordID recID=ABRecordGetRecordID(person);
    //get the user name
    CFStringRef firstName;
    firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);//it goes wrong here!
    CFStringRef lastName;
    lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    //bla bla bla.. the rest of the code
}

一切都很顺利。但是,当我尝试通过ABAddressBookGetPersonWithRecordID获取ABRecordRef时,就像它在下一个方法中一样:

下一步方法

+ (MSProfileEntry*) getPersonProfileThroughContactId:(NSInteger*)contactId{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    ABRecordRef person = 
    ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID)contactId);
    CFRelease(addressBook);
    if (person == nil) {
        return nil;
    }
    return [MSContactUtil getPersonProfileThroughABRecordRef:person];
}

整个应用程序在线崩溃:ABRecordCopyValue(person, kABPersonFirstNameProperty);

现在的问题是ABRecordCopyValue(person, kABPersonFirstNameProperty);ABAddressBookCopyArrayOfAllPeople完全正常,但会导致应用与ABAddressBookGetPersonWithRecordID崩溃。

有没有人知道如何解决这个问题?我真的不想只是为了寻找联系人而遍历整个联系人。

2 个答案:

答案 0 :(得分:3)

事实证明这是一个记忆问题。我忘了保留“addressBook”。当我执行以下行时:

firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

addressBook”已经清理干净了。在查询“addressBook”中的详细信息时,我们仍然需要“person”。

所以,记得放入以下行,你就会安全。

CFRetain(addressBook);

答案 1 :(得分:1)

两件事:

  • 您将(NSInteger*)contactId传递给getPersonProfileThroughContactId,然后致电ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID)contactId);。实际上你传递了一个包含联系人ID而不是id本身的整数的地址......
  • 您检查if (person == nil)但是此人可能不是零 - 您应该与NULL进行比较。我相信你的情况是NULL(因为我之前的观点)。

这两件事共同造成了崩溃。

按原样传递一个整数 - 而不是它的地址......

修改的:
像这样:

+ (MSProfileEntry*)getPersonProfileThroughContactId:(NSInteger)contactId