移动开发 \ iOS \ Object-C中类的属性

Object-C中类的属性

总点击19
简介:属性通常是指某些由对象封装或储存的数据。它可以是标志(如名称或颜色),也可以是与一个或多个其他对象的关系。一个对象的类定义一个接口,该接口使其对象的用户能获取并设定所封装属性的值。执行这些操作的方法,

属性通常是指某些由对象封装或储存的数据。它可以是标志(如名称或颜色),也可以是与一个或多个其他对象的关系。一个对象的类定义一个接口,该接口使其对象的用户能获取并设定所封装属性的值。执行这些操作的方法,称为存取方法。


存取方法有两种类型,每个方法都必须符合命名约定。“getter”存取方法返回属性的值,且名称与属性相同。“setter”存取方法设定属性的新值,且形式为 setPropertyName:,其中属性名称的第一个字母大写。正确命名的存取方法是 Cocoa 和 Cocoa Touch 框架的多种技术的关键元素,如键-值编码 (KVC),它的机制是,通过对象的名称间接访问对象的属性。


Objective-C 提供已声明的属性作为一种方便的写法,用于存取方法的声明和实现。在您的首个 iOS 应用程序中,您声明了 userName 属性:


@property (nonatomic,copy) NSString *userName;

使用已声明的属性后,就不必为该类中用到的每个属性实现 getter 和 setter 方法。而是使用属性声明,指定您想要的行为。编译器接着可以根据该声明,创建或合成实际的 getter 和 setter 方法。已声明的属性减少了您必须编写的样板文件代码量,因此使代码更简洁、更少机会出错。使用已声明的属性或存取方法,来获取和设定各项对象状态。


您在类接口中包括方法声明和属性声明。您在类的头文件中声明公共属性;而在源文件的类扩展中声明专有属性。(有关类扩展的简短说明及其示例,请参阅“协议和类别”。)控制器对象(如委托和视图控制器)的属性通常应该为专有的。


属性的基本声明使用 @property 编译器指令,后面紧跟属性的类型信息和名称。您还可以使用自定选项来配置属性,以定义存取方法如何表现、属性是否为弱引用,以及是否为只读。选项位于圆括号中,前面是 @property 指令。


以下代码行说明了更多的属性声明:


@property (copy) MyModelObject *theObject;  // Copy the object during assignment.

@property (readonly) NSView *rootView;      // Declare only a getter method.

@property (weak) id delegate;               // Declare delegate as a weak reference

编译器自动合成所声明的属性。在合成属性时,它创建自己的存取方法,以及“支持”该属性的专有实例变量。实例变量的名称与属性的名称相同,但具有下划线前缀 (_)。只有在对象初始化和取消分配的方法中,您的应用程序应该直接访问实例变量(而不是其属性)。


如果您想要让实例变量采用不同名称,可以绕过自动合成,并明确地合成属性。在类实现中使用 @synthesize 编译器指令,让编译器产生存取方法,以及进行特殊命名的实例变量。例如:


@synthesize enabled = _isEnabled;

同时,在声明属性时,您可以指定存取方法的自定名称,通常是使 Boolean 属性的 getter 方法遵循约定形式,如下所示:


@property (assign,getter=isEnabled) BOOL enabled; // Assign new value,change name of getter method

意见反馈 常见问题 官方微信 返回顶部