属性(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
