Ответ 1
Я бы предложил явно синтезировать свойство в вашей реализации MutableCar. Как в:
@implementation MutableCar
@synthesize name;
@end
Таким образом, clang не будет пытаться использовать autosynthesis
Edit:
Если вы не хотите использовать инкапсуляцию, и по другой причине вам нужно получить доступ к ivar из родительского класса, вам нужно сделать немного больше усилий:
Сначала файл Car.h остается тем же (я добавил метод printVar для печати ivar и свойства):
@interface Car : NSObject
- (void)printVar;
@property (strong, readonly) NSString *name;
@end
Теперь в файле .m, я реализую метод printVar, а также добавляю расширение класса, чтобы сообщить clang для создания сеттера:
// Private class extension, causes setName: to be created but not exposed.
@interface Car ()
@property (strong, readwrite) NSString *name;
@end
@implementation Car
- (void)printVar
{
NSLog(@"<Car> Hello %@, ivar: %@", self.name, _name);
}
@end
Теперь вы можете создать свой MutableCar.h, как и раньше:
@interface MutableCar : Car
@property (strong, readwrite) NSString *name;
@end
и ваш MutableCar.m должен выглядеть так:
@implementation MutableCar
@dynamic name;
- (void)printVar
{
[super printVar];
NSLog(@"<MutableCar> Hello %@", self.name);
}
@end
Таким образом, имя_имя ivar на родительском языке фактически написано с использованием родительского установщика, и вы можете получить к нему доступ.