2013-04-19 2 views
1

После определения свойства в интерфейсе класса я создаю метод setter с использованием автоматически созданного метода _property. Все идет отлично. Затем я создаю метод getter для того же свойства. Как только я это сделаю, компилятор выдает ошибку, которая _property не определена везде, где я ее использовал.Ошибка компилятора при создании методов getter для автоматических синтезированных свойств

Если у меня есть только определитель или сеттер, все работает нормально, но как только я определяю оба, _property перестает существовать.

Если я добавлю @synthesize property = _property; в начало моей реализации, проблема решена, но мне грустно.

ответ

4

Это нормально. Если вы объявляете свойство, компилятор обычно автоматически синтезирует методы ivar и getter и setter.

Но если вы явно определяете свои собственные методы получения и настройки, компилятор больше не генерирует ivar. Ваше решение состоит в том, чтобы явно объявить ваш собственный ivar. Вам не нужна линия @synthesize, просто объявите ivar.

Причина такого поведения заключается в том, что вполне возможно иметь реализацию свойства, которое фактически не использует ivar. Поэтому, если вы определяете как setter, так и getter, компилятор оставляет это до вас, чтобы решить, нужен ли ivar или нет.

BTW - это не новое поведение в Xcode 4.6.2. Это было верно с тех пор, как компилятор поддерживал автоматически синтезированные ивары.

+0

Абсолютно верно, я не уверен, почему я только сейчас столкнулся с этим фактом. Из любопытства '@synthesize property = _property' эффективно то же самое, что и определение ivar в заголовке? –

+0

По существу. Но вы не должны помещать ivar в заголовок. Он должен заходить в файл .m, поскольку он является приватным. Лично, поскольку вы не синтезируете геттер и сеттер, нет причин для синтеза ivar. Просто объявите свой собственный ivar. Тогда это непротиворечиво. – rmaddy

+0

Справа. Делает совершенный смысл. Благодаря! –

Смежные вопросы