Objective c 目标C合成变量下划线前缀不工作

Objective c 目标C合成变量下划线前缀不工作,objective-c,Objective C,我正在苹果官方网站上阅读关于在上合成属性的教程。以下是摘录: 除非另行指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为firstName的属性,合成的实例变量将被称为\u firstName 然而,后来它说: 要点:如果使用@synthesis而不指定实例变量名,如下所示: @firstName; 实例变量将与属性同名。 在本例中,实例变量也将被称为firstName,不带下划线 这些说法似乎不一致。当我使用合成像合成分子一样,然后尝试使用\u分子时,它显示以下错误

我正在苹果官方网站上阅读关于在上合成属性的教程。以下是摘录:

除非另行指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为firstName的属性,合成的实例变量将被称为\u firstName

然而,后来它说:

要点:如果使用@synthesis而不指定实例变量名,如下所示: @firstName; 实例变量将与属性同名。 在本例中,实例变量也将被称为
firstName
,不带下划线

这些说法似乎不一致。当我使用
合成
合成分子
一样,然后尝试使用
\u分子
时,它显示以下错误:使用未声明的标识符\u分子

知道我做错了什么吗

如果我不使用synthesis,也不为变量声明setter和getter,它们将如何访问

Objective-C的最新版本将
@synthesis
作为属性的默认值,因此不需要显式地编写
@synthesis firstName--编译器将为您处理此问题


正如@Timredy在一篇评论中指出的,您引用的两段文字之间的区别在于,一段文字是关于明确使用
@synthesis
指令时的行为(ivar与属性同名),而另一段文字描述了编译器自动合成ivar时的行为(ivar名称是带有下划线前缀的属性名称)。

您可以在@interface中声明实例变量和属性

在实现中,您可以使用

@synthesize property = instancevariable;
当您这样做时,编译器会创建一个名为“instancevariable”的实例变量(如果它还不存在),并根据需要为setter和getter生成代码

@synthesize property;
就其本身而言,与

@synthesize property = property; 
这意味着创建的实例变量的名称与属性的名称相同(如果该属性尚不存在)。是否自己创建了一个以下划线开头的实例变量并不重要。该实例变量将只是一个实例变量,可能会在代码中造成严重混乱

// No synthesize statement
完全一样

@synthesize property = _property;
这意味着,如果实例变量尚不存在,则它是使用前导下划线创建的。您是否自己创建了一个没有下划线的实例变量并不重要。该实例变量将只是一个实例变量,可能会在代码中造成严重混乱。在这种情况下,编译器将发出警告

有一个例外:如果您自己实现了所有必需的方法(setter和getter,或者只是readonly正确的getter),并且您没有使用@synthel,那么将不会创建任何实例变量。如果您使用@synthel,将如上所述创建一个实例变量


因此,最好的选择是只声明@property而不声明其他内容;将创建一个以下划线开头的实例变量。如果同时实现setter和getter,或者只实现只读属性的getter,则可能不需要实例变量。如果需要,可以声明实例变量或使用@synthesis创建实例变量。

您不需要使用现代Objective-c进行合成(协议中的属性除外)…只要省略它,您的IVAR将默认为下划线前缀。您能更详细地解释一下吗?如果我不使用
synthesis
,也不为变量声明setter和getter,它们将如何访问?是的,这似乎是可行的。从Xcode 4.4开始,Apple LLVM编译器将隐式合成适当的变量未使用@synthel明确合成的领带。这两种说法没有分歧(可以根据您的解释进行调整)第一个语句是指隐式合成,而后面的语句是指显式合成。是的,第一段是指第二种情况,我现在明白了。但是,从文档中根本不清楚,你说什么?