gpt4 book ai didi

objective-c - Objective C 合成变量下划线前缀不起作用

转载 作者:太空狗 更新时间:2023-10-30 04:00:56 33 4
gpt4 key购买 nike

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

Unless you specify otherwise, the synthesized instance variable has the same name as the property, but with an underscore prefix. For a property called firstName, for example, the synthesized instance variable will be called _firstName.

然而,后来,它说:

Important: If you use @synthesize without specifying an instance variable name, like this: @synthesize firstName; the instance variable will bear the same name as the property. In this example, the instance variable will also be called firstName, without an underscore.

这些说法似乎并不一致。当我使用像 synthesize numerator 这样的 synthesize,然后尝试使用 _numerator 时,它显示以下错误:use of undeclared标识符_numerator

enter image description here

知道我做错了什么吗?

最佳答案

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

在实现中,可以使用

@synthesize property = instancevariable;

当您这样做时,编译器会创建一个名为“instancevariable”的实例变量(如果它尚不存在),并根据需要为 setter 和 getter 生成代码。变量名称是您要使用的任何名称。

@synthesize property;

就其本身而言是一样的

@synthesize property = property; 

这意味着创建一个与属性同名的实例变量,如果它还不存在的话。您是否自己创建了一个以下划线开头的实例变量并不重要。该实例变量将只是一个实例变量,可能会导致您的代码出现重大困惑。

// No synthesize statement

完全一样

@synthesize property = _property;

这意味着创建一个带有前导下划线的实例变量(如果它尚不存在)。您是否自己创建了一个不带下划线的实例变量并不重要。该实例变量将只是一个实例变量,可能会导致您的代码出现重大困惑。在这种情况下,编译器会给出警告。

有一个异常(exception):如果您自己实现了所有必需的方法(包括 setter 和 getter,或者只是 readonly 的 getter),并且您不使用 @synthesize,则不会创建实例变量。如果你使用@synthesize,一个实例变量将被创建,如上所述。

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

关于objective-c - Objective C 合成变量下划线前缀不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24812961/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com