【发布时间】: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声明上不会做任何事情!