kABPersonAddressProperty вызывает сбои в ABAddressBookGetPersonWithRecordID - PullRequest
0 голосов
/ 07 августа 2010

Я пытаюсь быть 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
}

Все идет очень хорошо. Однако, когда я пытаюсь получить ABRecordRef через ABAddressBookGetPersonWithRecordID, как в следующем методе:

Следующий метод

+ (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 ]

3 голосов
/ 19 августа 2010

Оказалось, проблема с памятью. Я забыл сохранить "addressBook". К тому времени я выполнил следующую строку:

firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

"addressBook" уже очищен. Каким-то образом нам все еще нужно "addressBook" при запросе подробной информации в "person".

Итак, не забудьте поставить следующую строку, и вы будете в безопасности.

CFRetain(addressBook);

1 голос
/ 07 августа 2010

Две вещи:

  • Вы передаете (NSInteger*)contactId на getPersonProfileThroughContactId и после этого звоните ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID)contactId);.На самом деле вы передаете адрес целого числа, которое содержит идентификатор контакта, а не сам идентификатор ...
  • Вы проверяете if (person == nil), НО персона может не быть нулем - вы должны сравнить сNULL.Я считаю, что это NULL в вашем случае (из-за моего предыдущего пункта).

Эти две вещи вместе вызывают сбой.

Просто передайте целое число как есть - неего адрес ...

РЕДАКТИРОВАТЬ :Как это:

+ (MSProfileEntry*)getPersonProfileThroughContactId:(NSInteger)contactId
...