自动属性综合(@property)和inheritance
随着XCode 5.1,出现一个新的警告。 这让我明白,我做错了什么。
这个想法是有一个对象(模型),它是从原始类inheritance的可变版本。 所以这个想法是打开一个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
所以我想知道什么是正确的解决scheme来做这样的事情,如果这是可能的。 如果需要编写访问器,并避免使用自动合成等,只需要精确,并支持文件或任何其他答案。
我build议明确地综合你的MutableCar实现的属性。 如:
@implementation MutableCar @synthesize name; @end
那样,铿锵不会尝试使用自动合成
编辑:
如果你不想使用封装和其他原因,你需要从父类访问伊娃,那么你需要做更多的努力:
首先Car .h文件保持不变(我添加了一个printVar方法来打印ivar和属性):
@interface Car : NSObject - (void)printVar; @property (strong, readonly) NSString *name; @end
现在在.m文件中,我实现了printVar方法,并添加了一个类扩展来告诉clang创buildsetter:
// 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
现在你可以像以前一样创build你的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
这样,父母上的_name ivar实际上是使用父级设置者编写的,您可以访问它。