自动属性综合(@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实际上是使用父级设置者编写的,您可以访问它。