自动属性合成 (@property) 和继承

Posted

技术标签:

【中文标题】自动属性合成 (@property) 和继承【英文标题】:Auto property synthesis (@property) and inheritance 【发布时间】:2014-03-13 16:07:01 【问题描述】:

在 XCode 5.1 中,会出现一个新警告。这让我明白-显然-我做错了什么。

这个想法是有一个对象(一个模型),它是从原始类继承的可变版本。所以这个想法是打开一个属性是readonlyreadwrite

@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) 和继承的主要内容,如果未能解决你的问题,请参考以下文章

读取properties文件并获取属性值

属性文件操作之Properties与ResourceBundle

@property 的本质是什么?

原型 原型链和对象是怎么实现继承的

自动生成的 NSManagedObject 中的属性

属性和 ivars 的问题