В Objective-C с ARC, верно ли, что нам обычно нужно указывать неатомические атрибуты свойств?

Странно, что в книге Big Nerd Ranch iOS 5 (стр .73) и в книге программирования iOS 5 (O'Reilly, стр .314) (updadte: даже Kochan Objective-C книга Четвертое издание), в контексте ARC они говорят, что атрибут свойства по умолчанию assign... Но Документация Apple говорит, что значение по умолчанию strong.

Я также пробовал простую программу, где, если я не укажу strong, программа работает нормально, и если я укажу strong, она будет работать одинаково, а когда вместо assign будет использоваться компилятор, предупреждение, поэтому кажется, что по умолчанию действительно strong.

Поэтому, если большую часть времени мы хотим

@property (nonatomic, readwrite, strong) NSMutableArray *foo;

то мы можем просто написать

@property (nonatomic) NSMutableArray *foo;

так как остальные два (readwrite и strong) по умолчанию?

Ответ 1

readwrite и strong, действительно являются стандартными для ARC *. Под ручным подсчетом ссылок присваивание было (есть) по умолчанию. Я предпочитаю явно указывать их, потому что он дает более четкое представление о параметрах @property вместо того, чтобы полагаться на человека, читающего код, зная, что такое значения по умолчанию.

* strong - это значение по умолчанию, предполагающее, что вы либо разрешаете компилятору синтезировать переменную экземпляра для вас, либо объявили переменную экземпляра без явного классификатора прав (в этом случае ivar равен __strong по умолчанию в любом случае). В противном случае тип собственности по умолчанию соответствует квалификатору собственности в декларации ivar. Итак, если вы явно объявляете ivar с помощью __weak, тогда объявите @property для него без квалификатора собственности, синтезируемое свойство будет слабым. Все это описано в документации Clang ARC.