gpt4 book ai didi

ios - 是否建议为只读合成属性定义 ivars?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:42:47 29 4
gpt4 key购买 nike

我发现很多时候我想要一个合成的只读属性,我只是根据其他变量实现该属性的 getter 方法,而不需要 ivar,例如 (注意:我在界面中定义了 ivars,因为我使用的是 OmniGraffle UML 软件,它无法识别由合成属性自动生成的 ivars:


@interface Editor : UIView {
BOOL _wordWrap;
BOOL _showLineNumbers;
NSDictionary *_options;
}

@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;

@end

@implementation Editor

@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize options = _options;

- (NSDictionary *)options {
return @{
@"WordWrap" : [NSNumber numberWithBool:self.wordWrap],
@"ShowLineNumbers" : [NSNumber numberWithBool:self.showLineNumbers],
};
}

@end

在上面的 Editor 类中,我是否有必要在 header 定义中定义 _options ivar,more 重要的是自动-生成的ivar占用符号表中的内存或空间?另外,在这种情况下,使用copyretain 还是没有值会更有效?只是好奇。

最佳答案

首先:停止将你的ivar 声明放在你的@interface 中。它们属于您的@implementation。参见 this answer以获得详细的解释。

无论如何,考虑到您所写的内容,您的@synthesize options = _options 没有任何效果。

@synthesize 有两种可能的效果:

  1. 如果您的类没有实例变量,它会添加一个名为 _options 的实例变量。

  2. 它生成一个 getter 方法 options,如果您的类没有名为 options< 的方法,它会返回 _options 的值.

由于您手动定义了实例变量和 getter,因此 @synthesize 什么都不做。您可以完全删除它而不改变程序的含义。

在只读属性上指定copy 无效。 copyretain(或者,在 ARC 下更恰本地说,strong)属性只影响生成的 setter 方法,编译器不会生成readonly 属性的 setter 。 (如果您在类扩展中将属性更改为 readwrite,则 copy 很重要。)

是的,_options ivar 占用符号表中的内存(对于每个 Editor 实例)和空间。由于您没有使用 _options ivar,因此您应该将其完全删除。您还应该完全删除 @synthesize,这样编译器就不会为您生成 _options ivar。

关于ios - 是否建议为只读合成属性定义 ivars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663176/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com