nil和release区别

精贴 置顶
1194 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/6/25
.NET后台写JS代码 2011/11/3
网站地址多出jdfwkey的问题解析及... 2010/8/25
百度、google、Yahoo网站地图制作... 2011/1/30
数据库xxx的日志已满,请备份该数... 2013/7/19
<a>标签的伪类书写顺序问题... 2010/9/4
CEO名言 2010/8/31
什么是长尾关键词? 2010/9/24
Mysql 主从数据库同步 2010/9/12
用ASP实现网页BBS 2010/11/1
博主推荐
网站title标题如何正确修改不会被... 2013/8/26
ASP .NET MYSQL 的简单分页 并不... 2013/8/19
网站有弹窗广告这样的站点,百度... 2013/8/17
做淘宝SEO优化需要注意的8大问题 2013/8/17
淘宝网怎么做SEO优化 2013/8/17
站长们要学习的“苍井空精神” 2013/8/17
苹果公司今日发布了iOS 7第五个开... 2013/8/7
小米1刷V5系统WIFI不能连接解决办... 2013/8/1
本博客手机版上线咯!会员后台也... 2013/7/31
Win7系统环境安装配置PHP开发环境... 2013/7/29
随便看看
关于ASP.NET中Request.QueryStri... 2010/9/11
js图片滚动代码 2010/9/13
搜索引擎对SEO作弊的判定条件 2010/9/21
.NET(asp.net)里WAP开发及手机兼... 2013/6/19
.net用母版页和内容页实现动态Ti... 2013/8/22
操作系统常见问题:操作系统启动... 2010/9/7
如何使用标签阻止网页被收录? 2010/9/30
站长必去的十个编程网站 2010/10/19
ALT-代替属性 2010/9/19
PHP中文截取不乱码 2010/10/12
北京 上海 杭州 深圳 广州 成都