ошибка приведения в xcode при использовании метода делегата адресной книги - PullRequest
2 голосов
/ 08 декабря 2011

Я скопировал этот метод построчно из библиотеки Apple Dev и получал ошибки приведения для двух приведений NSString. Как это можно решить? (Я использую ARC)

- (BOOL)peoplePickerNavigationController:
        (ABPeoplePickerNavigationController *)peoplePicker
  shouldContinueAfterSelectingPerson:(ABRecordRef)person {

NSString* name = (NSString *)ABRecordCopyValue(person,
                                         kABPersonFirstNameProperty);
self.firstName.text = name;

name = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
self.lastName.text = name;

[self dismissModalViewControllerAnimated:YES];

return NO;
}

Спасибо за вашу помощь!

Ответы [ 2 ]

8 голосов
/ 08 декабря 2011

Похоже, вы используете ARC.

ARC запрещает стандартное приведение между указателями на объекты Objective-C и указателями других типов, включая указатели на объекты CoreFoundation.

Следующий код,что правильно при ручном управлении памятью, не компилируется с ARC:

NSString* name = (NSString *)ABRecordCopyValue(person,
                             kABPersonFirstNameProperty);

Чтобы компилировать с ARC, необходимо аннотировать приведение.См. мостовые приведения .

NSString* name = (__bridge_transfer NSString *)ABRecordCopyValue(person,
                                               kABPersonFirstNameProperty);

. Аннотация __bridge_transfer перемещает значение в ARC и передает владение , т. Е. Сообщает ARC, что этот объект уже сохранен.и что ARC не нужно сохранять его снова.

2 голосов
/ 08 декабря 2011

Попробуйте этот тип кастинга, вместо:

CFStringRef name = (CFStringRef)ABRecordCopyValue(person, kABPersonFirstNameProperty);

self.lastName.text = (__bridge NSString *) name;

CFStringRef и NSString * равны "bridged bridless" (документация связана с вами), но компилятор ищет тип Core Foundation, возвращаемый из вашего вызова ABRecordCopyValue. Так что мои линии там используют тип Core Foundation. И затем, когда вы назначаете его метке, вы можете затем привести name к типу NSString *.

Вот более подробная информация о Бесплатном мосте с участием ARC .

...