Ответ 1
Нет, нет. Синтезированные свойства автоматически добавляются в класс A и его подклассы.
Если у вас есть класс A с экземпляром var "foo", который имеет директиву @property/@synthesize, а класс B наследует от класса A, нужно ли также @property/@синтезировать "foo"? Причина, о которой я прошу, заключается в том, что, когда я пытаюсь использовать класс B "foo", вызывающий класс говорит, что "foo" не является чем-то вроде структурированного объединения или члена, что заставляет меня полагать, что он должен быть явно синтезирован.
Нет, нет. Синтезированные свойства автоматически добавляются в класс A и его подклассы.
Если у вас есть класс A с экземпляром var "foo", который имеет директиву @property/@synthesize, а класс B наследует от класса A, нужно ли также @property/@синтезировать "foo"?
Нет.
Я прошу, потому что, когда я пытаюсь использовать класс B "foo", вызывающий класс говорит...
Нет, компилятор говорит об этом.
... что "foo" не является чем-то вроде структурированного объединения или члена, что заставляет меня полагать, что он должен быть явно синтезирован.
Это. В классе А.
Компилятор дает вам это предупреждение, потому что он не знает о @property, потому что вы не объявили его и не импортировали заголовок, который его объявляет. Вы говорите, что заголовок класса A объявляет свойство, поэтому импортируйте заголовок класса A в реализацию класса B, чтобы компилятор знал об этом свойстве при компиляции класса B.
На всякий случай это помогает кому-то.
Я тоже столкнулся с этой проблемой и прочитал эти ответы и не смог напрямую получить доступ к суперклассическим переменным. Они были объявлены как свойства и синтезированы в суперклассе, и я импортировал заголовок в свой подкласс. Я застрял, пока не обнаружил, что мне нужно объявить переменные-члены в разделе @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;
При наследовании вам не нужно переопределять любые свойства или переменные.
Возможно, если вы разместите свой заголовочный файл ClassB или часть, то люди смогут лучше определить вашу проблему.
Правильно, вы просто объявляете @property за пределами типичных фигурных скобок переменных переменных переменных, а затем @synthesize свойство в файле .m. Я заметил, что в дочернем классе вы используете self.propertyName для ссылки на него, но в родительском классе вы можете просто использовать имя мгновенной переменной.