可能重复:
Objective-c中的"实例变量"和"属性"之间是否存在差异?
self.ivar和ivar之间的区别?
在@interface行之后立即在括号中声明变量和在下面定义属性之间有什么区别?
例如...
@interface GCTurnBasedMatchHelper : NSObject {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}
@property (assign, readonly) BOOL gameCenterAvailable;
Run Code Online (Sandbox Code Playgroud)
isa*_*aac 23
在括号中定义变量只是声明它们的实例变量.
声明(和合成)属性会根据括号内的条件为实例变量生成getter和setter.这在Objective-C中尤其重要,因为通常通过getter和setter来管理内存(例如,当一个值被分配给ivar时,通过setter来保留并最终释放所分配的对象).除了内存管理策略之外,该实践还促进了封装并减少了原本需要的简单代码的数量.
在括号中声明一个ivar然后是一个相关的属性(如你的例子中),这是非常常见的,但这并不是绝对必要的.定义属性和合成就是所需要的,因为隐式地合成属性也会创建一个ivar.
Apple目前建议的方法(在模板中)是:
在头文件中定义属性,例如:
@property (assign, readonly) gameCenter;
Run Code Online (Sandbox Code Playgroud)
然后在实现中合成并声明ivar:
@synthesize gameCenter = __gameCenter;
Run Code Online (Sandbox Code Playgroud)
最后一行合成gameCenter属性并断言,分配给属性的任何值都将存储在__gameCenterivar中.同样,这不是必需的,但是通过定义合成器旁边的ivar,您将减少必须键入ivar名称的位置,同时仍然明确命名它.
Shu*_*ank 15
{
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}
Run Code Online (Sandbox Code Playgroud)
以上两个被称为成员变量 它们不能在课外访问.(重要的一点)(除非你提供自定义的getter和setter)
如果你做了一个,@property 那么变量可以在类内部以及类外读取.所以你可以自动生成setter和getter.
然后不需要声明与成员变量相同..
这样做只是为了提高可读性..你可以轻松阅读而不是阅读
@property (non..)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19119 次 |
| 最近记录: |