nil和release区别

精贴 置顶
1863 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
随便看看
关于URL组成部分的指南 2010-09-23
ASP内建对象Application和Sessio... 2010-10-23
windows已经阻止此软件因为无法验... 2013-06-26
我想优化推广很多个关键字,怎么... 2010-09-29
eWebEditor在IE8,IE7下所有按钮无... 2012-09-20
WinForm中配置数据库连接字符串 2010-09-03
整型数据 2010-10-16
我的站怎么就不被收录呀? 2010-09-29
如何查看反向链接更准确? 2010-09-18
Google Analytics 分析的关键字怎... 2010-10-02
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都