我正在尝试成为一个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
崩溃。
有没有人知道如何解决这个问题?我真的不想只是为了寻找联系人而遍历整个联系人。
答案 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