Objective C综合变量下划线前缀不起作用
Posted
技术标签:
【中文标题】Objective C综合变量下划线前缀不起作用【英文标题】:Objective C synthesized variable underscore prefix not working 【发布时间】:2014-07-17 20:30:13 【问题描述】:我正在阅读 Apple 官方网站上关于在Apple 合成属性的教程。摘录如下:
除非您另外指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为 firstName 的属性,合成的实例变量将称为 _firstName。
然而,后来,它说:
重要提示:如果您使用 @synthesize 而不指定实例变量名称,如下所示: @synthesize firstName; 实例变量将具有与属性相同的名称。 在此示例中,实例变量也将称为
firstName
,不带下划线。
这些陈述似乎存在分歧。当我像synthesize numerator
一样使用synthesize
,然后尝试使用_numerator
时,它显示以下错误:use of undeclared identifier _numerator。
知道我做错了什么吗?
【问题讨论】:
你不需要@synthesize
与现代 Objective-c (协议中的属性除外)...只需省略它,你的 iVar 将默认为下划线前缀。
你能详细解释一下吗?如果我不使用synthesize
,并且也不为变量声明setter 和getter,它们将如何访问?
是的,这似乎确实有效..
从 Xcode 4.4 开始,Apple LLVM 编译器将隐式合成未使用 @synthesize 显式合成的属性。
这两个陈述没有分歧(可以根据您的解释来证明)。第一个语句是指隐式综合,而后一个语句是指显式综合。
【参考方案1】:
您可以在@interface 中声明实例变量和属性。
在实现中,可以使用
@synthesize property = instancevariable;
当您这样做时,编译器会创建一个名为“instancevariable”的实例变量(如果它尚不存在),并根据需要为 setter 和 getter 生成代码。变量名称是您想要使用的任何名称。
@synthesize property;
其本身与
相同@synthesize property = property;
这意味着创建一个与属性同名的实例变量,如果它还不存在的话。您是否自己创建了一个实例变量并以下划线开头并不重要。该实例变量将只是一个实例变量,可能会在您的代码中造成重大混乱。
// No synthesize statement
完全一样
@synthesize property = _property;
这意味着如果实例变量尚不存在,则使用前导下划线创建实例变量。您是否自己创建了没有下划线的实例变量并不重要。该实例变量将只是一个实例变量,可能会在您的代码中造成重大混乱。在这种情况下,编译器会给出警告。
有一个例外:如果您自己实现了所有必需的方法(setter 和 getter,或者只是只读属性的 getter),并且您不使用 @synthesize,则不会创建实例变量。如果您使用@synthesize,将如上所述创建一个实例变量。
所以最好的选择是只声明@property 而没有别的;将创建一个以下划线开头的实例变量。如果你同时实现了 setter 和 getter,或者只是一个只读属性的 getter,你可能不需要实例变量。如果需要,可以声明实例变量或使用@synthesize 创建它。
【讨论】:
【参考方案2】:如果我不使用 synthesize,也不为变量声明 setter 和 getter,如何访问它们?
Objective-C 的最新版本使 @synthesize
成为属性的默认值,因此您无需显式编写 @synthesize firstName;
-- 编译器会为您处理这些。
正如@TimReddy 在评论中指出的那样,您引用的两段之间的区别在于,当您明确使用@synthesize
指令时(ivar 与属性的名称相同),其中一段是在谈论行为,而另一个描述编译器自动合成 ivar 时的行为(ivar 名称是带有下划线前缀的属性名称)。
【讨论】:
是的,第一段指的是第二种情况,我现在明白了。但是,从文档中并不清楚,怎么说呢?以上是关于Objective C综合变量下划线前缀不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Objective C - 当从按钮调用 VC 时,ViewController 的功能不起作用
使用 NSLider 的 setHidden 不起作用 - Objective C
iOS 上 Swift 中的自定义 SceneKit 几何图形不起作用,但等效的 Objective C 代码可以