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

时间:2012-03-14 12:46:05

标签: objective-c ios

  

可能重复:
  Is there a difference between an “instance variable” and a “property” in Objective-c?
  Difference between self.ivar and ivar?

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

例如......

@interface GCTurnBasedMatchHelper : NSObject {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}

@property (assign, readonly) BOOL gameCenterAvailable;

3 个答案:

答案 0 :(得分:23)

在括号中定义变量只是声明它们的实例变量。

根据括号内的条件,声明(和合成)属性会为实例变量生成getter和setter。这在Objective-C中尤其重要,因为通常通过getter和setter来管理内存(例如,当一个值被分配给ivar时,通过setter来保留并最终释放所分配的对象)。除了内存管理策略之外,该实践还促进了封装,并减少了原本需要的简单代码量。

在括号中声明一个ivar然后是一个相关的属性(如你的例子中),这是非常常见的,但这并不是绝对必要的。定义属性和合成就是所需要的,因为隐式地合成属性也会创建一个ivar。

Apple目前建议的方法(在模板中)是:

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

@property (assign, readonly) gameCenter;

然后合成&在实施中声明ivar:

@synthesize gameCenter = __gameCenter;

最后一行合成gameCenter属性,并声明分配给该属性的任何值都将存储在__gameCenter ivar中。同样,这不是必需的,但是通过定义合成器旁边的ivar,您将减少必须键入ivar名称的位置,同时仍明确命名它。

答案 1 :(得分:15)

{
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}

以上两个被称为成员变量 他们无法在课堂外访问。(重点)(除非您提供自定义的getter和setter)

如果你创建一个@property,那么变量可以在类内部以及类外读取。所以可以为你自动生成setter和getter。

然后声明与成员变量相同..

这样做只是为了提高可读性..你可以轻松阅读

 @property (non..) 

答案 2 :(得分:2)

定义属性时,会为您创建一个getter和setter。当您使用object.member访问者访问它们时,会自动调用getter。

在接口设置器中声明变量时,不会为您编写getter。您也可以为它们指定一些可见性修饰符,如@ private,@ public等。