iOS头文件中的属性和变量之间的区别?

Ala*_*lan 23 objective-c ios

可能重复:
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)

  • 它不仅仅是可读性,它还被认为是内存管理策略的重要组成部分. (3认同)