Ожидаемые проблемы с идентификатором и ARC при повторном использовании кода - PullRequest
2 голосов
/ 07 ноября 2011

Я скопировал некоторые классы из старого проекта в мой новый проект. Мне пришлось удалить все операторы release/autorelease, но у меня все еще есть некоторые ошибки:

 NSArray *allContacts = [(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook)];
    for (int i =0; i < allContacts.count; i++) {
        ABRecordRef person = [allContacts objectAtIndex:i];

В первой строке я получаю Expected identifier. В третьей строке я получаю implicit conversion of an Objective-C pointer to 'ABRecordRef (aka 'cpmnst void *)' is disallowed with ARC.

Есть идеи как это исправить?

1 Ответ

6 голосов
/ 07 ноября 2011

Рассмотрим:

NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

Функция, имя которой содержит Copy, возвращает ссылку, которой владеет вызывающая сторона, что означает, что вызывающая сторона должна освободить ее. В ARC освобождение происходит автоматически, но вы должны сообщить ARC, что ссылка, возвращаемая этой функцией, принадлежит вызывающей стороне, поскольку в объявлении функции отсутствует эта информация. Это пример передачи права собственности, и вы должны использовать __bridge_transfer в этом случае:

NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

В

ABRecordRef person = [allContacts objectAtIndex:i];

-objectAtIndex: возвращает объект, который не принадлежит вызывающей стороне. Так как вы назначаете этот объект не-объектному типу (ABRecordRef), вам нужно простое приведение моста:

ABRecordRef person = (__bridge ABRecordRef)[allContacts objectAtIndex:i];
...