OGeek|极客世界-中国程序员成长平台

标题: ios - 对属性和 ivars 感到困惑 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 23:12
标题: ios - 对属性和 ivars 感到困惑

我意识到这里已经有很多关于属性与 ivar 的问题,但经过大量研究后,我似乎无法找到明确的答案。

我了解,当您声明如下属性时,编译器会自动为您合成支持 ivar 和两个访问器方法:

@property NSString *myString;

让我感到困惑的是,myString 是一个实际的实例变量吗?我问这个的原因是因为你永远不能像这样访问它:

NSLog(@"Value of myString is: %@", myString);

您要么必须使用支持 ivar _myString,要么使用一种 getter 方法,例如 [self myString]self.myString。所以我很困惑,因为通常你可以简单地使用变量名。

最重要的是,有人告诉我,您不应该将 myString 称为属性,并且属性一词只能用于引用两个访问器方法,它们是当您使用 @property 指令时,编译器会为您合成。

您说“我有一个名为 myString 的属性”真的是错误的吗?如果这是错误的,那么正确的说法是什么?

任何帮助解决这个问题将不胜感激。我整天都在努力巩固属性和 ivars 是不同事物的想法。



Best Answer-推荐答案


这里是您问题的答案-

is myString an actual instance variable? - No
Would it really be wrong for you to say "I have a property called myString" , and if that is wrong then what would be the correct way to say it? - No its not wrong to call it.

所以看起来真正让你感到困惑的是命名约定,如果你仔细阅读属性后面的命名约定 -

当您使用@property 语法来声明对象的属性时,如“封装数据”中所述,编译器会自动合成相关的getter 和setter 方法(除非您另有说明)。如果您出于任何原因需要提供自己的访问器方法实现,请务必确保为属性使用正确的方法名称,以便通过点语法调用您的方法,例如。

除非另有说明,否则 getter 方法应使用与属性相同的名称。对于名为 firstName 的属性,访问器方法也应称为 firstName。此规则的异常(exception)是 bool 属性,getter 方法应以 is 开头。例如,对于一个名为 paused 的属性,getter 方法应称为 isPaused。

属性的 setter 方法应使用 setPropertyName: 形式。对于名为 firstName 的属性,setter 方法应称为 setFirstName:;对于名为 paused 的 bool 属性,setter 方法应称为 setPaused:.

查看开发者网站了解详细说明 - https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/Conventions/Conventions.html

关于ios - 对属性和 ivars 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378359/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4