#objective-c #xcode4.2 #automatic-ref-counting
#цель-c #xcode4.2 #автоматический подсчет ссылок #objective-c
Вопрос:
Я скопировал некоторые классы из старого проекта в свой новый проект. Мне пришлось удалить все 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. Ну, у вас довольно вопиющая синтаксическая ошибка в первой строке. Что вы пытались сделать со вторым?
2. хорошо исправлено первое … но я не знаю, как исправить вторую ошибку
Ответ №1:
Рассмотрим:
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];