Подтвердить что ты не робот

Изменение свойств и ivars после миграции ARC

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

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

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

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

@property (nonatomic) MyClass *objectToUse;

и в нашей реализации мы просто имеем

@synthesize objectToUse;

Если мы затем напишем внутри некоторого метода:

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

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

objectToUse = [[MyClass alloc] init];

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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