Использование свойства @ synthesize / @ в наследовании Objective-C - PullRequest
12 голосов
/ 22 февраля 2009

Если у вас есть класс A с экземпляром var "foo", у которого есть директива @ property / @ synthesize, а класс B наследуется от класса A, нужно ли также @ property / @ synthesize "foo"? Причина, по которой я спрашиваю, заключается в том, что, когда я пытаюсь использовать «foo» класса B, вызывающий класс говорит, что «foo» не является чем-то вроде структурированного объединения или члена, что заставляет меня верить, что его необходимо явно синтезировать.

Ответы [ 5 ]

10 голосов
/ 22 февраля 2009

Если у вас есть класс A с экземпляром var "foo", у которого есть директива @ property / @ synthesize, а класс B наследуется от класса A, нужно ли также @ property / @ synthesize "foo"?

номер

Причина, по которой я спрашиваю, заключается в том, что когда я пытаюсь использовать "foo" класса B, вызывающий класс говорит…

Нет, это говорит компилятор.

… что «foo» не является чем-то вроде структурированного объединения или члена, что заставляет меня поверить, что его нужно явно синтезировать.

Это так. В классе А.

Компилятор дает вам это предупреждение, потому что он не знает о @property, потому что вы не объявили его и не импортировали заголовок, который его объявляет. Вы говорите, что заголовок класса A объявляет свойство, поэтому импортируйте заголовок класса A в реализацию класса B, чтобы компилятор знал об этом свойстве при компиляции класса B.

10 голосов
/ 22 февраля 2009

Нет, нет. Синтезированные свойства добавляются в класс A и его подклассы автоматически.

4 голосов
/ 07 декабря 2012

На всякий случай, если это кому-нибудь поможет.

Я тоже сталкивался с этой проблемой и читал эти ответы, но все еще не мог получить доступ к переменным суперкласса напрямую. Они были объявлены как свойства и синтезированы в суперклассе, и я импортировал заголовок в свой подкласс. Я застрял, пока не обнаружил, что мне нужно объявить переменные-члены в разделе @interface в суперклассе, а также свойство суперкласса ....! например,

@interface BuoyAnnotation : NSObject <MKAnnotation>
{
    CLLocationCoordinate2D coordinate;
    CLLocation* location;
    int type; 

}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) CLLocation* location;
@property (nonatomic, assign) int type;
1 голос
/ 22 февраля 2009

При наследовании вам не нужно повторно объявлять какие-либо свойства или переменные.

Возможно, если вы разместите заголовочный файл ClassB или его часть, люди смогут лучше определить вашу проблему.

0 голосов
/ 16 октября 2013

Правильно, вы просто объявляете @property вне фигурных скобок объявления переменной типичного члена, а затем @synthesize свойство в файле .m. Я заметил, что в дочернем классе вы используете self.propertyName для ссылки на него, но в родительском классе вы можете просто использовать мгновенное имя переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...