【问题标题】:Is it recommended to define ivars for readonly synthesized properties?是否建议为只读合成属性定义 ivars?
【发布时间】:2014-08-31 00:56:45
【问题描述】:

我发现很多时候我想要一个综合的只读属性,我只是根据其他变量来实现该属性的 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类中,我是否有必要在标题定义中定义_options ivar,更多重要的是,自动生成的ivar是否占用了内存或空间符号表?此外,在这种情况下使用copyretain 或不使用值会更有效吗?只是好奇。

【问题讨论】:

  • 你为什么要明确定义和合成 ivars?
  • 你还没有使用 ARC 吗?
  • @vikingosegundo 我知道编译器会自动生成 ivars,但我使用的是 UML 软件(OmniGiraffe),它似乎无法处理由合成属性生成的 ivars。是的,我正在使用 ARC。我的代码中有什么东西让我看起来好像没有使用 ARC 吗??
  • "OmniGiraffe" --> "OmniGraffle" ?
  • @Martin R 是的,我就是这个意思

标签: ios objective-c properties synthesize ivars


【解决方案1】:

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

无论如何,鉴于您所写的内容,您的@synthesize options = _options 无效。

@synthesize 有两种可能的影响:

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

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

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

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

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

【讨论】:

  • 我写 ivars 是因为我使用 OmniGiraffe 来生成 UML 的
  • 不过它会消耗内存。
  • 我仍然可以使用 self.options 访问该属性,对吗?
  • 是的。当你写self.options时,它和写[self options]完全一样:它发送options消息给self
  • 如果您使用的是readwrite 属性,答案可能会有所不同。更新您的问题以包含您的 text 属性的详细信息、您尝试使用它的方式以及您遇到的确切错误。
猜你喜欢
  • 2015-08-14
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多