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

Автоматический синтез свойств (@property) и наследование

С XCode 5.1 появляется новое предупреждение. Это заставило меня понять - очевидно, что я делал что-то неправильно.

Идея заключалась в том, чтобы иметь объект (модель) и его изменяемую версию, которая наследуется от исходного класса. Поэтому идея состоит в том, чтобы открыть свойство, которое было readonly до readwrite

@interface Car : NSObject
    @property (strong, readonly) NSString *name;
@end

@interface MutableCar : Car
    @property (strong, readwrite) NSString *name;
@end

Те должны быть в отдельных файлах (например, в двух нормальных классах).

И он дает следующее предупреждение:

Auto property synthesis will not synthesize property 'name' because it is 'readwrite' but it will be synthesized 'readonly' via another property

Итак, я хотел бы знать, какое правильное решение сделать что-то подобное, если это возможно. если ему нужно писать аксессоры и избегать использования автоматического синтеза и т.д. Просто прошу вас, точно, и поддержите свой ответ с документацией или любым другим.

4b9b3361

Ответ 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 на родительском языке фактически написано с использованием родительского установщика, и вы можете получить к нему доступ.