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

从逻辑上,确保遵守 NSStringsetter 必须使用 copy 而不是 retain 的原则。

原子性

一定要注意属性(property)的开销。缺省情况下,所有 synthesizesettergetter 都是原子的。这会给每个 get 或者 set 带来一定的同步开销。将属性(property)声明为 nonatomic,除非你需要原子性。

点引用

点引用是地道的 Objective-C 2.0 风格。它被使用于简单的属性 setget 操作,但不应该用它来调用对象的其它操作。

正确的做法:

  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