我发现很多时候我想要一个综合的只读属性,我只是根据其他变量来实现该属性的 getter 方法,而不需要 ivar,例如 (注意:我在界面中定义 ivars,因为我使用的是 OmniGraffle UML 软件,它不能识别由合成属性自动生成的 ivars):
@界面编辑器:UIView {
BOOL _wordWrap;
BOOL _showLineNumbers;
NSDictionary *_options;
}
@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;
@结尾
@实现编辑器
@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize 选项 = _options;
- (NSDictionary *)options {
返回 @{
@"WordWrap": [NSNumber numberWithBool:self.wordWrap],
@"ShowLineNumbers": [NSNumber numberWithBool:self.showLineNumbers],
};
}
@结尾
在上面的 Editor
类中,我是否有必要在标题定义中定义 _options
ivar 并且 more 重要的是自动- 生成的 ivar 占用符号表中的内存或空间?另外,在这种情况下使用 copy
、retain
还是不使用值会更有效吗?只是好奇。
首先:停止将您的 ivar 声明放在 @interface
中。它们属于您的 @implementation
。见 this answer详细解释。
无论如何,鉴于您编写的内容,您的 @synthesize options = _options
无效。
@synthesize
有两种可能的效果:
如果你的类没有实例变量,它会添加一个名为 _options
的实例变量。
它会生成一个 getter 方法,options
,如果你的类没有名为 options
。
由于您手动定义了实例变量和 getter,因此 @synthesize
什么也不做。您可以完全删除它而不改变程序的含义。
在只读属性上指定 copy
无效。 copy
和 retain
(或者,在 ARC 下更准确地说,strong
)属性只影响生成的 setter 方法,编译器不会生成readonly
属性的 setter 。 (如果您在类扩展中将属性更改为 readwrite
,则 copy
很重要。)
是的,_options
ivar 占用了内存(对于 Editor
的每个实例)和符号表中的空间。
由于您没有使用 _options
ivar,因此您应该完全删除它。您还应该完全删除 @synthesize
,这样编译器就不会为您生成 _options
ivar。
关于ios - 是否建议为只读合成属性定义 ivars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663176/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |