Вопросы о readonly @property в ARC - PullRequest
6 голосов
/ 03 января 2012

В моем файле интерфейса (.h) у меня есть

@property(readonly) NSString *foo;

и в моем файле реализации (.m) у меня есть

@synthesize foo;

При включенном ARC компилятор выдает мне эту ошибку: Проблема с автоматическим подсчетом ссылок: ARC запрещает синтезировать свойство объекта Objective C с неопределенным атрибутом владения или хранения.

Ошибка исчезнет, ​​если я добавлю strong, weak или copy к свойству. Почему это? Почему могут существовать различия между этими вещами для свойства только для чтения , каковы эти различия и почему программист должен беспокоиться о них? Почему компилятор не может интеллектуально определить настройку по умолчанию для свойства только для чтения?

Еще один вопрос, пока я на нем: strong, weak или copy - единственные вещи, которые имеют смысл в ARC, верно? Я не должен больше использовать retain и assign, не так ли?

Ответы [ 3 ]

12 голосов
/ 03 января 2012

Вы объявили @property, у которого нет резервного ивара. Таким образом, когда компилятор видит @synthesize, он пытается синтезировать резервный ивар для вас. Но вы не указали, какой именно ивар вы хотите. Это должно быть __strong? __weak? __unsafe_unretained? Первоначально атрибут хранения по умолчанию для свойств был assign, что совпадает с __unsafe_unretained. Однако в ARC это почти всегда неправильный выбор. Поэтому вместо того, чтобы синтезировать небезопасный ивар, они требуют, чтобы вы указали, какой тип ивара вы хотите.

5 голосов
/ 11 октября 2012

В последней версии XCode и последних компиляторах Clang эта ошибка больше не возникает.Вы можете указать свойство как @property(nonatomic, readonly) NSObject *myProperty; в интерфейсе, синтезировать его в реализации, и полученный ivar предполагается равным strong.Если вы хотите быть явным или выбрать слабое, вы можете сделать это в исходном свойстве, например @property(nonatomic, readonly, retain).Objective-C постепенно становится менее избыточным.

2 голосов
/ 03 января 2012

Это здесь, как объявление остальной части вашего кода.
Когда вы получаете доступ к свойству этого класса из другой части вашего кода, вам нужно знать, является ли объект, который вы получаете, сильным или слабым.

Раньше было более очевидно, когда ARC не существует, потому что программисту нужна была эта информация. Теперь ARC делает многое прозрачным, так что это правда, вы можете удивиться, почему это все еще здесь.


Почему компилятор не может интеллектуально определить настройку по умолчанию для свойства только для чтения?

Я предполагаю, что было бы довольно легко установить соглашение, что ни одно ключевое слово не означает strong или означает weak. Если это не было сделано, у них наверняка была причина.

...