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 代码可以

Objective-C 变量和基本的数据类型

reachabilityWithAddress 在 Objective C 编程中不起作用

Objective C - NSArray 的 indexOfObject:不起作用