#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);
}