Objective-C 语法之特性

2013-04-10 18:59

Objective-C 语法之特性

by Rhino

at 2013-04-10 10:59:34

original http://golanger.cn/?p=1100

特性:

@property声明的形式是:
     @property (attributes) type name;
attributes 描述了如何编写访问器:
1. assign, retain和copy这些属性影响到合成的setter如何构建。
     a. assign直接将新值赋值给你的特性。它是非对象特性的唯一选择。
     b. 对于在引用计数下的对象特性,assign创建了一个弱引用。
     c. ratain要求编译器@synthesize你的访问器,它创建一个等价于下面代码的setter
- (void) setName: (NSString *) newName
{
    [newName retain];
    [name release];
    name = newName;
}
     注意:在垃圾收集下,retain与assign相同,并且我们不需要使用它,除非编写必须在引用计数
     和垃圾收集下都能工作的框架代码。
     d. 如果使用copy并且要求编译器来@synthesize你的访问器,它创建一个等价于下面的setter
- (void) setName: (NSString *) newName
{
    NSString *tem = name;
    name = [newName copyWithZone: nil];
    [tmp release];
}
     注意:要使用copy,特性的类型必须是能够复制的类。类必须通过实现copyWithZone: 而采用NSCopying协议。
     e. 如果没有显示指定assign, retain或copy,编译器假设一个默认值assign。这对于基础类型不是问题,然而,对于引用计数下的对象特性,如果你没有指定三者之一,那么将会得到一个编译器警告。
2. readwrite和readonly
     a. 默认为readwrite,该特性的值可以设置也可以获取,两个访问器都合成。
     b. 如果特性声明为readonly,只有getter合成。
3. nonatomic
     a. 默认是atomic,表示该方法是线程安全的,但是没有提供atomic关键字。如果指定了nonatomic,则编译器合成访问器时不考虑线程安全性。
     b. 对于非对象特性或者使用垃圾收集时,getter是一条简单的返回语句,setter是一次简单的赋值,并且总是atomic的。
     c. 合成的setter和getter使用锁来防止其他线程中断设置或获取。
     d. 锁在性能方面付出了代价,如果你不打算编写多线程代码,则应该将自己的特性声明为nonatomic的,然后,合成的访问器不会使用锁。
4. setter=name和getter=name允许你提供其他的名称。