属性(Property)
Tip
属性(Property)通常允许使用,但需要清楚的了解:属性(Property)是 Objective-C 2.0 的特性,会限制你的代码只能跑在 iPhone 和 Mac OS X 10.5 (Leopard) 及更高版本上。点引用只允许访问声明过的 @property
。
命名
属性所关联的实例变量的命名必须遵守以下划线作为后缀的规则。属性的名字应该与成员变量去掉下划线后缀的名字一模一样。
使用 @synthesize
指示符来正确地重命名属性。
- @interface MyClass : NSObject {
- @private
- NSString *name_;
- }
- @property(copy, nonatomic) NSString *name;
- @end
- @implementation MyClass
- @synthesize name = name_;
- @end
位置
属性的声明必须紧靠着类接口中的实例变量语句块。属性的定义必须在 @implementation
的类定义的最上方。他们的缩进与包含他们的 @interface
以及 @implementation
语句一样。
- @interface MyClass : NSObject {
- @private
- NSString *name_;
- }
- @property(copy, nonatomic) NSString *name;
- @end
- @implementation MyClass
- @synthesize name = name_;
- - (id)init {
- ...
- }
- @end
字符串应使用 copy 属性(Attribute)
应总是用 copy
属性(attribute)声明 NSString
属性(property)。
从逻辑上,确保遵守 NSString
的 setter
必须使用 copy
而不是 retain
的原则。
原子性
一定要注意属性(property)的开销。缺省情况下,所有 synthesize
的 setter
和 getter
都是原子的。这会给每个 get
或者 set
带来一定的同步开销。将属性(property)声明为 nonatomic
,除非你需要原子性。
点引用
点引用是地道的 Objective-C 2.0 风格。它被使用于简单的属性 set
、get
操作,但不应该用它来调用对象的其它操作。
正确的做法:
- NSString *oldName = myObject.name;
- myObject.name = @"Alice";
错误的做法:
- NSArray *array = [[NSArray arrayWithObject:@"hello"] retain];
- NSUInteger numberOfItems = array.count; // not a property
- array.release; // not a property