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

可能重复:
Objective-c中的“实例variables”和“属性”有什么不同?
self.ivar和伊娃之间的区别?

在@interface行之后立即声明括号中的variables和定义下面的属性有什么区别?

例如…

@interface GCTurnBasedMatchHelper : NSObject { BOOL gameCenterAvailable; BOOL userAuthenticated; } @property (assign, readonly) BOOL gameCenterAvailable; 

定义括号中的variables只是声明它们的实例variables。

声明(和合成)属性根据括号内的标准为实例variables生成getter和setter。 这在Objective-C中特别重要,因为通常通过getter和setter来pipe理内存(例如,当一个值被分配给一个ivar时,通过setter来分配的对象被保留并最终被释放)。 除了内存pipe理策略之外,该实践还促进了封装并减less了否则将需要的不重要的代码量。

在方括号中声明一个伊娃,然后是一个关联的属性(如你的例子),这是非常普遍的,但这不是绝对必要的。 定义财产和综合是所有这一切都需要,因为综合财产隐含也创build一个伊娃。

苹果目前build议的方法(在模板中)是:

在头文件中定义属性,例如:

 @property (assign, readonly) gameCenter; 

然后在执行中合成并声明伊娃:

 @synthesize gameCenter = __gameCenter; 

最后一行合成gameCenter属性,并断言无论赋值给属性的值都将存储在__gameCenter伊娃。 再次,这是没有必要的,但通过定义在合成器旁边的伊娃,你正在减less的位置,你必须input伊娃的名字,同时仍明确命名。

 { BOOL gameCenterAvailable; BOOL userAuthenticated; } 

上面两个被称为成员variables他们不能在课堂外访问(重要的一点) (除非你提供自定义的getter和setter)

如果你创build一个@property那么这个variables可以在类内部读取,也可以在类之外读取。所以setter和getters是为你自动生成的

那么声明相同的成员variables是不需要的..

这只是为了增加可读性而已。您可以轻松阅读,而不是阅读

  @property (non..) 

当你定义一个属性时,为你创build一个getter和setter。 当你使用object.member访问它们时,setter和getter被自动调用。

当你在接口设置器中声明variables时,getter不是为你写的。 你也可以给他们指定一些可见性修饰符,比如@ private,@ public等