Iphone开发基础篇(六)-ObjectC之Property,assign,retain,copy等关键字

例子:

@property(nonatomic,retain) NSString *name;


property:属性的定义,相当于Java/C#语言的setter和getter方法。

assign:简单的赋值,不更改索引的计数。

copy:建立一个索引计数为1的对象,然后释放旧对象;这是为了减少对上下文的依赖而引入的机制.

retain:释放旧对象,将旧对象的值赋予新对象,再增加新对象的索引计数1。

retain的实际语法为: 

- (void)setName:(NSString *)newName { 
    if (name != newName) { 
       [name release]; 
       name = [newName retain]; 
       // name’s retain count has been bumped up by 1 
    } 

copy的实际语法为: 

- (void)setName:(NSString *)newName { 
    if (name != newName) { 
       [name release]; 
       name = [newName copy]; 
       // name’s retain count has been bumped up by 1 
    } 

针对具体的数据类型在属性定义应该这样选择:

使用assign:对基础的数据类型,比如NSInterger,CGFloat和C数据类型(int,float,double,char等等)。

使用copy:针对NSString;

使用retain:针对NSObject及其子类。

使用nonatomic:单线程,防止在写未完成的时候被另外一个线程读取,造成数据读取出错。非原子性访问, 不加同步, 多线程并发访问会提高性能. 注意, 如果不加此属性, 则默认是两个访问方法都为原子型事务访问. 锁被加到所属对象

使用release:基于一般的初始化,使用alloc和init关键词初始化的,要在恰当的地方release掉,全局变量在dealloc方法里面release,常规变量在不需要的时候就要释放掉。

 

面试的时候会经常问到这些,理解透了。


 

iOS 5中的strong和weak关键字


iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性

strong 用来修饰强引用的属性;

@property (strong) SomeClass * aObject; 
对应原来的 
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; 

weak 用来修饰弱引用的属性;
@property (weak) SomeClass * aObject; 
对应原来的 
@property (assign) SomeClass * aObject; 

__weak, __strong 用来修饰变量,此外还有 __unsafe_unretained, __autoreleasing 都是用来修饰变量的。
__strong 是缺省的关键词。
__weak 声明了一个可以自动 nil 化的弱引用。
__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。


使用ARC时,需要遵循一定的规则:

  • 不能使用retain/release/retainCount/autorelease方法
  • 不能使用NSAllocateObject/NSDeallocateObject方法
  • 不能显示的调用dealloc方法
  • 使用@autoreleasepool块代替NSAutoreleasePool
  • 不能使用NSZone(防止内存碎片化而引入的结构)
  • 显示转换"id"和"void *"

引申阅读:
Beginning ARC in iOS 5 Tutorial Part 1: http://www.raywenderlich.com/zh-hans/20855/ios-5-arc-%E5%85%A5%E9%97%A8-13

你可能感兴趣的:(#,Object-C入门系列)