ARC запрещает синтезировать свойство с неуказанным владельцем или хранилищем.

Я создал @property из UIColor,

@property (nonatomic) UIColor *color;

а затем я попытался синтезировать его:

@synthesize color = _color;

но я получаю сообщение об ошибке:

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

Что это обозначает?

Все, что я пытаюсь сделать, это создать свойство для объекта UIColor, которое меняет цвет.


person William Sham    schedule 10.12.2011    source источник
comment
Возможно, вам придется дать полное объявление и реализацию класса, поскольку это кажется допустимым. Хранилище по умолчанию в свойствах сильное, если только это не блок, в котором вы должны указать его вручную как copy.   -  person Vikram Rao    schedule 17.07.2014


Ответы (2)


Измените объявление вашего свойства на:

@property (nonatomic,strong) UIColor *color;

так что ARC знает, что его следует сохранить. Это было бы скомпилировано без strong до ARC, но это было бы опасно, поскольку по умолчанию было assign, и цвет был бы освобожден, если бы он не был сохранен в другом месте.

Я очень рекомендую видео WWDC2011 об ARC.

person Brian    schedule 10.12.2011
comment
Это не требуется, если свойство не является блоком, и в этом случае оно должно быть явно указано как copy. Так что дело в другом. - person Vikram Rao; 17.07.2014
comment
@VikramRao, этому вопросу 2,5 года. В то время, когда это было задано, для объявления класса хранилища требовались синтезированные свойства, и значение по умолчанию было assign. - person Brian; 22.07.2014
comment
@Brian В любом случае, было бы неплохо обновить принятый ответ, так как люди могут увидеть его через Google. Эти разработчики, которые этого не знают, могут подумать, что им нужно написать это явно. На данный момент эта ошибка отображается в основном с блоками, которые должны быть copy. Объекты по умолчанию strong, примитивные типы, такие как BOOL, NSInteger и т. д. - assign, и маловероятно, что кто-то увидит эту ошибку с объектами/примитивными типами. - person Nat; 16.04.2015
comment
@Vive На самом деле вам больше не нужно объявлять блоки copy - теперь можно объявить их strong. Если блок уже был скопирован в кучу, copy всегда вел себя как strong (оба просто сохраняли блок). Однако, если блок все еще находился в стеке, copy копировал его в кучу, а strong ничего не делал. Разработчики LLVM посчитали это ошибкой, независимо от того, что говорится в документации Apple, и теперь strong ведет себя как copy, если блок находится в стеке, точно так же, как copy ведет себя как strong, если он находится в куче - IOW это больше не имеет значения, только weak. - person Mecki; 17.07.2015
comment
@ Брайан Даже в то время, когда вас спросили, ваш ответ все еще был неправильным. Это правда, по умолчанию до ARC раньше был assign, но класс хранения не требовался, как если бы он требовался, дефолта вообще не было бы. По умолчанию означает, что если я не скажу что-то еще, возьмите это. Отсутствие класса хранения создало свойство assign. Может быть, не то, что вы хотели, но компилятор из-за этого не выдал ошибку. Почему применение поведения по умолчанию было бы ошибочным? - person Mecki; 17.07.2015
comment
@Mecki, мой ответ был правильным, но да, мой комментарий об обязательном/по умолчанию не имеет смысла - person Brian; 17.07.2015
comment
@ Брайан Ты прав, я только что проверил developer.apple.com/library/ios/releasenotes/ObjectiveC/ и нашел раздел: How do blocks work in ARC? Blocks “just work” when you pass blocks up the stack in ARC mode, such as in a return. You don’t have to call Block Copy any more.. Спасибо за полезную информацию, не заметил. - person Nat; 20.07.2015
comment
Как упомянул @VikramRao, когда вы указываете блок как свойство, вы должны явно указать копию. Спасибо за этот совет, его следует выделить подробнее. - person Markus; 09.09.2015

Вы должны указать strong или weak хранилище в объявлении свойства (рядом с nonatomic).

person JoePasq    schedule 10.12.2011
comment
@WilliamSham вам не нужно делать это для всех указателей, только для свойств. Указатели в локальной области видимости по умолчанию являются сильными ссылками, но вы можете указать ARC обрабатывать указатель как слабую ссылку, используя __weak. - person Kekoa; 03.11.2012
comment
@JoePasq Не обязательно всегда указывать хранилище. Проверьте мои комментарии в других ответах и ​​вопросах. - person Vikram Rao; 17.07.2014