Object-C中类的属性

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

存取方法有两种类型,每个方法都必须符合命名约定。“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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值