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