Изменение со свойствами и ivars после миграции ARC - PullRequest
12 голосов
/ 06 марта 2012

Я использовал опцию «Преобразовать в объект C ARC» в Xcode 4.3, чтобы преобразовать проект, запущенный в Xcode 4.0, для использования ARC. После исправления ошибок, обнаруженных инструментом, я прошел процесс, в котором инструмент миграции удалил все сообщения о выпуске, а также сохранил атрибуты в моих объявлениях свойств. Так что теперь у меня есть все мои свойства, имеющие только атрибут (неатомный) . После прочтения документации у меня до сих пор нет четкого ответа на вопрос, что делать.

Итак, мой вопрос: Если вы опускаете ключевое слово, касающееся семантики сеттера (сильный, слабый, сохраняемый, присваивайте) в объявлении свойства, что является атрибутом по умолчанию для свойств при использовании ARC?

В документации я обнаружил, что атрибутом свойства по умолчанию является assign . Тем не менее, они также говорят, что теперь атрибут по умолчанию для ivars , если вы его опустите, равен strong .

Чтобы лучше объяснить мой вопрос, вот пример. В заголовочном файле у нас есть объявление:

@property (nonatomic) MyClass *objectToUse;

и в нашей реализации у нас просто есть

@synthesize objectToUse;

Если мы потом напишем внутри какой-нибудь метод:

self.objectToUse = [[MyClass alloc] init];

создали ли мы сильную (сохраняющую) или слабую (назначаемую) ссылку? Если мы вместо этого напишем

objectToUse = [[MyClass alloc] init];

с помощью ивара мы изменили ситуацию с политикой сохранения объектов? Мне кажется, что теперь с ARC, лучшая практика использования свойств для управления памятью больше не та же практика.

Ответы [ 2 ]

16 голосов
/ 27 марта 2012

Я открыл инцидент технической поддержки. Инженер подтвердил, что значение по умолчанию было изменено с «назначить» на «сильный» . Причина - именно то несоответствие, которое вы описали. Теперь у ivars и @properties одинаковые значения по умолчанию.

Он сказал, что и документация (и предупреждения, которые получают некоторые люди) неверны и будут исправлены. (Инструмент преобразования корректен.) Пока это не сделано, я бы вообще избежал неявного значения по умолчанию . Всегда явно указывайте «сильный», «слабый» или «назначить».

Редактировать. Документация clang теперь официально документирует это изменение.

7 голосов
/ 06 марта 2012

Тип отношения по умолчанию по-прежнему assign, т. Е. Слабая ссылка. Кроме того, в режиме ARC компилятор выдаст ошибку при @synthesize использовании методов доступа, если вы явно не укажете тип отношения.

Разница между присвоением self.objectToUse и objectToUse заключается в том, что вторая форма всегда будет использовать ARC для retain или assign, тогда как в первой форме будет использоваться copy, если вы указали отношение copy .

...