Objective C property



Objective C的属性定义时提供了一堆的修饰符,readonly, readwrite, assign, retain, copy, nonatomic,看代码都糊涂,看了一下《The Objective-C Programming Language》中有关属性定义的章节,节选如下:

Accessor Method Names 存取方法名称> 属性对应的getter, setter默认的方法名称是propertyName和setPropertyName:,比如属性“foo”的存取方法是foo和setFoo:。
>
>
getter=getterName 指定属性的get存取方法名称。对于布尔型值会用is作为get存取方法的前缀。
> setter=setterName 指定属性的set存取方法名称。如果属性是readonly,而指定了setter方法,会得到编译错误。
>
> 使用.是对getter和setter的简便的封装,两者是一致的。
Writablility 读写属性> readwrite: 默认。
>
readonly
>
> 在implementation块中使用@synthesize 自动生成getter/setter存取方法。

Setter Semantics setter方法语义> assign: 默认,表明setter使用简单的赋值,用于标量数据类型,如NSInteger, CGRect,或者不是你拥有的对象,比如delegate。retain和assign在GC模式下是一样的。
> retain:用于对象赋值。前一个值会被发送一个release消息。Mac OS X v10.6以前只针对Objective-C对象类型有效,不能用于Core Foundation对象;但在v10.6以后可以使用attribute关键字标明Core Foundation属性在内存管理上和对象同样对待,比如:
> > @property(retain) attribute((NSObject)) CFDictionaryRef myDictionary;
> > `
>
>
copy:表明对象的拷贝用于赋值,前一个值会被发送一个release消息,拷贝通过调用copy方法实现。只针对对象类型有效,并且必须实现NSCopying协议。
>
> 不同的约束依赖于你是否采用GC:
>
> 如果你没有使用GC,那么对于对象属性你必须严格标明是采用assign,retain或者copy,否则会得到一个编译器警告。(鼓励你想明白到底采用什么方式的内存管理。)
>
如果你使用GC,那么默认情况下不会得到警告,除非属性类是基于NSCopying。

Atomic 原子性> atomic,默认。存取方法在多线程环境中提供更安全的存取。如果使用了retain或copy,而没有表明nonatomic,那么在引用计数的环境中,get存取方法使用锁来保持和释放要返回的值,类似于:
> >
`
> > [_internal lock]; // lock using an object-level lock
> > id result = [[value retain] autorelease];
> > [_internal unlock];
> > return result;
>
> nonatomic,直接返回值,效率更快。
>
> 注意:属性的原子性并不等同于对象是线程安全的。
Manage Ownership> weak
>
strong: default。
>
> 这个要和assign, retain, copy整合在一起看看Objective C的内存管理机制才行。