自动属性合成 (@property) 和继承
Posted
技术标签:
【中文标题】自动属性合成 (@property) 和继承【英文标题】:Auto property synthesis (@property) and inheritance 【发布时间】:2014-03-13 16:07:01 【问题描述】:在 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
所以我想知道做类似事情的正确解决方案是什么,如果可能的话。如果需要编写访问器并避免使用自动合成等。请准确并通过文档或其他内容支持您的答案。
【问题讨论】:
我无法使用给定的代码重现警告。 我做了,是的,您需要将它放在单独的文件中才能拥有它(创建两个类) 任何我可以通过或忽略的标志来摆脱这个? 【参考方案1】:我建议在您的 MutableCar 实现中显式合成该属性。如:
@implementation MutableCar
@synthesize name;
@end
这样clang就不会尝试使用autosynthesis
编辑:
如果你不想使用封装并且由于其他原因需要从父类访问 ivar,那么你需要做更多的努力:
首先 Car .h 文件保持不变(我添加了一个 printVar 方法来打印 ivar 和属性):
@interface Car : NSObject
- (void)printVar;
@property (strong, readonly) NSString *name;
@end
现在在 .m 文件上,我正在实现 printVar 方法并添加一个类扩展来告诉 clang 创建 setter:
// 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
这样,父级上的 _name ivar 实际上是使用父级设置器编写的,您可以访问它。
【讨论】:
这是否意味着功能上的任何差异或是否相同? 使用它后,它不是一个好的答案,它是准确的并删除了警告,但它改变了它的工作方式,因为它在子类中创建了一个新的 iVar 而不是使用父类的它受到保护。 @anc 你能告诉我你的具体情况吗?你有那个属性的特定 ivar 吗?这种情况应该有效,请参见此示例:gist.github.com/Reflejo/11c91b929bf021308b95 @ancAinu 你会得到:“Car1:测试名称”和“Car2:测试名称”。是否需要显式访问 MutableCar 上的 ivar?以上是关于自动属性合成 (@property) 和继承的主要内容,如果未能解决你的问题,请参考以下文章