属性(Property)
Tip
属性(Property)通常允许使用,但需要清楚的了解:属性(Property)是 Objective-C 2.0 的特性,会限制你的代码只能跑在 iPhone 和 Mac OS X 10.5 (Leopard) 及更高版本上。点引用只允许访问声明过的 @property。
命名
属性所关联的实例变量的命名必须遵守以下划线作为后缀的规则。属性的名字应该与成员变量去掉下划线后缀的名字一模一样。
使用 @synthesize 指示符来正确地重命名属性。
1. @interface MyClass : NSObject {
2. @private
3. NSString *name_;
4. }
5. @property(copy, nonatomic) NSString *name;
6. @end
7.
8. @implementation MyClass
9. @synthesize name = name_;
10. @end
位置
属性的声明必须紧靠着类接口中的实例变量语句块。属性的定义必须在 @implementation 的类定义的最上方。他们的缩进与包含他们的 @interface 以及 @implementation 语句一样。
1. @interface MyClass : NSObject {
2. @private
3. NSString *name_;
4. }
5. @property(copy, nonatomic) NSString *name;
6. @end
7.
8. @implementation MyClass
9. @synthesize name = name_;
10. - (id)init {
11. ...
12. }
13. @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 操作,但不应该用它来调用对象的其它操作。
正确的做法:
1. NSString *oldName = myObject.name;
2. myObject.name = @"Alice";
错误的做法: 1. NSArray *array = [[NSArray arrayWithObject:@"hello"] retain]; 2. 3. NSUInteger numberOfItems = array.count; // not a property 4. array.release; // not a property
