我意识到这里已经有很多关于属性与 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-推荐答案 strong>
这里是您问题的答案-
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/
|