设为首页 加入收藏

TOP

(iPhone/iPad)浅谈Objective-C中release和nil的关系
2014-11-24 14:46:21 来源: 作者: 【 】 浏览:22
Tags:iPhone/iPad 浅谈 Objective-C release nil 关系

注意到经常有一个这样的问题:某指针对象先release后=nil,这里后跟个=nil有什么作用?不写行不行?


简单一点说是,release是用来释放内存,nil是将对象指针设为null,nil本身对内存没什么影响,但他处理指针,尤其是避免野指针倒是很有必要。


举一个例子:


NSString *str=[[NSString alloc] init];


当我不需要str时


执行[str release];


str 的retain值减1,但是如果当前retain值>0,却紧随其后加一句str=nil;那么这时[str retainCount]应该为0,因为[nil retainCount]==0;但这时很明显存在内存泄露。


所以一个很好的写作习惯是:


当对象的retainCount==1时,写完[str release];后接着写上str=nil; 这样,当在后面的代码再次调用str相关的方法属性,也不会报错,因为之前已经将str设置为空指针,再调用str的方法也会被认为是null,不会真正调用,更不会报错。


例如下列代码:(以下所有代码段都已经过实际操作验证)




但是,现在又有另外一个问题,请看下列代码:




第一个i=2,没问题,因为view1 init了一次,retain了1次,retain值为2。


第二个i=0,根据上面所讲的推断,也没问题,因为之前view1=nil,空指针的retainCount值为0。


第三个i=1,也没什么问题,因为view2是一个被赋了值的新指针,它不同于指针view1,二者是2个独立的指针,而且,view2还被赋了值分配了内存地址。


但是,第四个i呢?i=


答案是i=1。为什么会这样?下面是真实输出结果:




有时候crash,原因是你向一块未申请的内存发送了一条消息,最终成了系统回收速度问题了,所以,个人认为,以后碰到类似这种问题,干脆手动init,release,至少这样能很快释放,更便于清楚当前对象的内存情况。


以上是我对release nil操作的一些理解,欢迎更多人加入讨论中。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇(iPhone/iPad)代码调用“设置”中.. 下一篇Android导入导出txt通讯录工具【..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: