在OC中,经常会用到release和nil,我们通常会这样写,[obj release]; obj=nil;我们先release再把对象置为nil,这两者是有区别的。release是真正释放内存。nil是将一个对象指针置为空,切断指针和内存中对象的联系,nil本身对内存没什么影响,在处理野指针的时候很有必要。
两个指针指向同一个对象,其中一个指针清空(=nil),不会影响另一个;两个指针指向同一个对象,其中一个释放内存release,也即retainCount-1,会影响另一个,如果引用到另一个指针会报错。
我们来对比:
(1)引用一个retainCount=0的指针是会出错的,比如 [obj release];再NSLog(@"%@",obj); 执行这段语句是会出错的
(2)引用一个内存地址0x000000的指针是不会出错的,比如obj=nil,在NSLog(@"%@",obj);执行不会出错
(3)调用[obj release]; 指针仍然指向内存块0x221342
(4)调用obj=nil;指针不指向任何内存块,为0x000000
所以,在调用release和=nil的时候,我们可以做一下总结:
(1)如果只是release而没有置为nil,应用程序也不能不会报错,但是会不稳定,程序的健壮性不够好,因为没有设置self.obj = nil,在release这个obj后,如果在之后又用到了这个对象,因为在系统内存中已经不存在了,程序就会崩溃,所以在release一个对象后应该也要将该对象置为nil,在之后如果用到了这个obj也不会造成崩溃。
(2)一个指针调用 release 函数,是会影响到所有指向同一对象的指针。总的来说,释放内存(rlease)方面,所有的指针是共享内存的。一个指针=nil,只会影响到本身,不会影响到所有指向同一对象的其它指针。总的来说,指针清空(=nil)方面,所有 的指针是独立的。