关于C#:iOS头文件中属性和变量之间的区别?

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;

最后一行合成gameCenter属性,并断言分配给该属性的任何值都将存储在__gameCenterivar中。同样,这是不必要的,但是通过定义合成器旁边的ivar,您减少了必须键入ivar名称而仍然显式命名它的位置。


1
2
3
4
{
BOOL gameCenterAvailable;
BOOL userAuthenticated;
}

以上两个称为成员变量不能在类外部访问它们。(要点)(除非提供自定义getter和setter)

如果制作一个@property,那么变量既可以在类内读取,也可以在类外读取..因此会自动为您生成setter和getter..

然后不需要声明与成员变量相同。

只是为了提高可读性。你读起来比读起来容易

1
 @property (non..)


定义属性时,将为您创建getter和setter。当您使用OCx1〔2〕setter和getter访问它们时,会自动调用它们。

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