Подтвердить что ты не робот

Использование свойства @synthesize/@в Objective-C наследовании

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

4b9b3361

Ответ 1

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

Ответ 2

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

Нет.

Я прошу, потому что, когда я пытаюсь использовать класс B "foo", вызывающий класс говорит...

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

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

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

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

Ответ 3

На всякий случай это помогает кому-то.

Я тоже столкнулся с этой проблемой и прочитал эти ответы и не смог напрямую получить доступ к суперклассическим переменным. Они были объявлены как свойства и синтезированы в суперклассе, и я импортировал заголовок в свой подкласс. Я застрял, пока не обнаружил, что мне нужно объявить переменные-члены в разделе @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;

Ответ 4

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

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

Ответ 5

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