Ожидаемые проблемы с идентификатором и ARC при повторном использовании кода

#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];