Difference between properties and variables in iOS header file?
Possible Duplicate:
Is there a difference between an"instance variable" and a"property" in Objective-c?
Difference between self.ivar and ivar?
在@interface行后立即在括号中声明变量和在下面定义属性有什么区别?
例如。。。
1 2 3 4 5 6 | @interface GCTurnBasedMatchHelper : NSObject { BOOL gameCenterAvailable; BOOL userAuthenticated; } @property (assign, readonly) BOOL gameCenterAvailable; |
在括号中定义变量只是声明实例变量。
声明(和合成)属性会根据括号内的条件为实例变量生成getter和setter。这在Objective-C中尤其重要,因为通常是通过getter和setter来管理内存(例如,当一个值分配给一个ivar时,通过setter来保留和最终释放分配的对象)。除了内存管理策略之外,该实践还促进了封装,并减少了原本需要的琐碎代码的数量。
在方括号中声明一个IVAR,然后声明一个相关的属性(如您的示例中所示)是非常常见的,但这并不是严格必需的。定义属性和合成是所需的全部,因为隐式合成属性也会创建一个ivar。
苹果目前(在模板中)建议的方法是:
在头文件中定义属性,例如:
1 | @property (assign, readonly) gameCenter; |
然后在实现中合成和声明ivar:
1 | @synthesize gameCenter = __gameCenter; |
最后一行合成
1 2 3 4 | { BOOL gameCenterAvailable; BOOL userAuthenticated; } |
以上两个称为成员变量不能在类外部访问它们。(要点)(除非提供自定义getter和setter)
如果制作一个
然后不需要声明与成员变量相同。
只是为了提高可读性。你读起来比读起来容易
1 | @property (non..) |
定义属性时,将为您创建getter和setter。当您使用OCx1〔2〕setter和getter访问它们时,会自动调用它们。
当您在接口setter和getter中声明变量时,不会为您编写。您还可以为它们指定一些可见性修饰符,如@private、@public等。