nil和release区别

精贴 置顶
1804 0

nil和release区别困扰了我好久,测试多次并看看网上的解释,做个总结:
      self.p=nil 和[p release]都可以释放内存自不必详细说明,因为属性在赋值的时候是调用set方法,里面封装了release消息。问题就在多出的部分,p被重新赋值为nil。nil据我观察,好像就是一个特定的地址(不知道到我理解是否正确,如果有哪位高手知道具体情况,请赐教呀!!!以及指向哪?应该是空地址,指向0内存),具体是哪我也不是很清楚。这样做的目的只是为内存安全着想的,因为如果你把对象release了,但它可能随机读取其它数据(应该是本对象引用仍然指向此地址,而此地址可能被其它数据所使用),而重新赋值为nil便没有这个问题,nil就是NULL的define。nil有个好处就是,无论你发送任何消息它都不会响应,也就不会异常了。这时候我们有时在类中声明的成员变量,有时并未进行初始化(默认值为nil,但没分配内存空间),这时我们仍然在dealloc方法中进行release也不会异常的,nil的retainCount始终为0,因此你可以无限次进行release。但是如果你进行初始化后则release完后(retainCount==0),倘若再release则产生异常,原因刚才说了,objective-c只为retainCount==0且值为nil不进行处理(nil对所有消息不响应,即可以对nil调用方法,而不致导致程序崩溃或抛出异常),换句话说,当你将对象release后,你的对象并不是nil,我的理解是你仍然指向源地址,虽然此内存并不存在(不过此时它仍然对消息响应,如果不识别则异常)。另外需要提及网上别人提的注意点,有时我们打印已release完毕的对象retainCount时会显示1,而不是预期的0(即异常),因为此时我们虽然最后一次(指预期将调用dealloc的)发出了release消息,但内存并不是立即释放,此时你仍然可以访问,直到系统某时刻释放它。这时候你可以在之前进行一些NSLog等操作,让系统有时间去释放,一切按计划进行。

  • 没有任何评论
今日天气 ···

···

···

···

热门排行
CSS cursor鼠标样式一览表 2012-06-25
.NET后台写JS代码 2011-11-03
网站地址多出jdfwkey的问题解析及... 2010-08-25
数据库xxx的日志已满,请备份该数... 2013-07-19
百度、google、Yahoo网站地图制作... 2011-01-30
<a>标签的伪类书写顺序问题... 2010-09-04
什么是长尾关键词? 2010-09-24
CEO名言 2010-08-31
Mysql 主从数据库同步 2010-09-12
用ASP实现网页BBS 2010-11-01
博主推荐
本个人博客微信公众平台上线啦~~... 2013-10-13
饼哥网络互联上线啦~~要买域名空... 2013-09-20
网站title标题如何正确修改不会被... 2013-08-26
饼哥通讯录系统上线啦,欢迎大家... 2013-08-24
ASP .NET MYSQL 的简单分页 并不... 2013-08-19
网站有弹窗广告这样的站点,百度... 2013-08-17
做淘宝SEO优化需要注意的8大问题 2013-08-17
淘宝网怎么做SEO优化 2013-08-17
站长们要学习的“苍井空精神” 2013-08-17
苹果公司今日发布了iOS 7第五个开... 2013-08-07
随便看看
下面这段代码输出什么?为什么? 2010-11-29
让你电脑C盘快起来,揪出占据硬盘... 2010-09-07
在ASP中限制同一表单被多次提交 2010-10-26
看懂这些故事 你做人就很成功了 2010-10-14
利用模版生成html页 2010-09-10
SQL快捷键大全 2010-09-09
搜索引擎对SEO作弊的判定条件 2010-09-21
content = "IE=edge,chrome=1" 详... 2013-10-23
一句话入门SEO 2010-09-02
通过表单创建word的一个例子 2010-11-03
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都