Сбой при ABRecordCopyValue

#iphone #ios

#iPhone #iOS

Вопрос:

Ниже приведен метод:

 -(id)getValueForProperty:(NSUInteger) propertyId{
   if(personRec != NULL)
        return (id)ABRecordCopyValue(personRec, (ABPropertyID)propertyId);   
   }
}
  

Я вызываю вышеуказанный метод следующим образом:

 NSString *lastName = (NSString *)[self getValueForProperty:kABPersonLastNamePhoneticProperty];
//or
NSString *lastName = (NSString *)[self getValueForProperty:kABPersonLastNameProperty];

NSString *firstName = (NSString *)[self getValueForProperty:kABPersonFirstNamePhoneticProperty];
//or
NSString *firstName = (NSString *)[self getValueForProperty:kABPersonFirstNameProperty];

NSString *orgName = (NSString *)[self getValueForProperty:kABPersonOrganizationProperty];
  

но когда я запускаю приложение на устройстве, оно показывает, что оно сбой в строке

 return (id)ABRecordCopyValue(personRec, (ABPropertyID)propertyId);   
  

в каком случае это может привести к сбою?

Комментарии:

1. Является personRec ли указание допустимым ABRecord ?

2. Я проверил обнуляемость personRec и да, он должен указывать на действительную запись ABRecord. Логически это должно быть правильно, но как я могу программно проверить правильность personRec?

3. Под «действительным» я подразумеваю, что он указывает на живой объект, а не на тот, который был выпущен или что-то в этом роде. Отладчик сообщает вам. Кроме того, вам нужно рассказать нам, как он «вылетает». Вы получаете исключение? Если да, то какой? О какой ошибке сообщает вам отладчик?

4. какой у вас сбой? вызываете ли вы метод из того же потока, в котором вы запросили запись?

5. На самом деле я не могу увидеть этот сбой во время отладки, но я вижу сбой, когда я отключаю устройство от системы и запускаю приложение. Таким образом, единственным источником информации является файл сбоя. Это может быть связано с потоком, но у меня нет подсказок, истек ли срок действия объекта или нет.

Ответ №1:

Может случиться так, что ABMultiValueRef возвращается для одного из ваших идентификаторов свойств при вызове ABRecordCopyValue, но вы пытаетесь вставить его в NSString .

В этом случае, что вам следует делать (скажем, вы пытаетесь получить первый адрес электронной почты и используете ARC):

 ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
int no = ABMultiValueGetCount(emails);
if ( no > 0 )
{
    CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, 0);
    NSString* email = CFBridgingRelease(emailRef);
}