【问题标题】:Will a readonly property with a custom getter have an instance variable synthesized?具有自定义 getter 的只读属性是否会合成实例变量?
【发布时间】:2014-04-08 13:34:40
【问题描述】:

我有一种情况,我不想为一组属性合成实例变量(我通过用户默认值和钥匙串来管理它们)。

如果我有以下,_loginUsername肯定会被合成:

@property (nonatomic, readonly) NSString *loginUsername;

而且我知道如果我有以下情况,实例变量将不会被合成,因为声明说“我要自己处理它”:

@property (nonatomic, getter = loginUsername, setter = setLoginUsername) NSString *loginUsername;

带有自定义 getter 的只读属性的行为是否相同?:

@property (nonatomic, readonly, getter = loginUsername) NSString *loginUsername;

是否会为最终的属性声明合成一个_loginUsername?我很确定不会有,但我正在努力更好地掌握属性属性,所以想确保我不会走远。

解释这在编译时是否已知的奖励积分(在 Xcode 中没有作弊和检查!)。

我的实现文件中没有任何 @synthesize 语句。

【问题讨论】:

  • "禁止在 Xcode 中作弊和检查!"等等,什么?
  • @ChrisWagner - 好的,你可以检查 Xcode :) 但我想知道它是如何知道运行前的。我想只是简单的静态分析 - 我想不出更复杂的场景会导致编译时的不确定性
  • 我不太了解具体细节来回答这个问题,但我会用@property (nonatomic, readonly, getter = loginUsername) NSString *loginUsername; 补充一点,我仍然可以在我的实现中编译具有_loginUsername = nil; 的代码。此外,当我有@property (nonatomic, readonly, getter = loginUsername, setter = setLoginUsername:) NSString *loginUsername; 时,我仍然可以这样做。看起来文档在撒谎!
  • Xcode IntelliSense 应该知道它是否可用,只需在定义自定义 getter 和 setter 后键入 `_loginUsername'。我敢打赌它会抱怨!
  • @ChrisWagner - 我刚刚尝试过,如果您在实现文件中定义了获取或设置,但仍然尝试使用_loginUsername,则它是一个编译时错误。只是将它们设置在 @property 声明上不会做任何事情!

标签: objective-c properties


【解决方案1】:

注意:编译器会自动合成一个实例变量 在它还合成至少一个访问器的所有情况下 方法。如果您为读写实现了 getter 和 setter 属性或只读属性的 getter,编译器将 假设您正在控制属性实现 并且不会自动合成实例变量。如果你还 需要一个实例变量,您需要请求一个 合成

Programming with Objective-c - Encapsulating data - 在您可以实现自定义访问器方法

【讨论】:

  • 宾果游戏!那是我的预感。感谢您清除 @m-porooshani
  • @bdalziel 我做苹果开发人员已经有一段时间了,但我一直很喜欢阅读苹果的编程指南,它们简直太棒了,它们阐明了既平凡又重要且最有可能的主题在我们的日常工作中是看不见的。试一试。我回答了你的问题,因为我记得几周前我已经在我的回答中提到的指南中读过它。好喜欢我的朋友。
猜你喜欢
  • 2014-08-31
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2017-04-27
  • 2010-11-14
  • 2013-11-01
相关资源
最近更新 更多