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,不会真正调用,更不会报错。
例如下列代码:(以下所有代码段都已经过实际操作验证)
- UIView *view1=[[UIView alloc] init];
- UIView *view2=[view1 retain];
- int i=[view1 retainCount];
- NSLog(@"i:%d",i);
- [view1 release];
- view1=nil;
- [view1 addSubview:view2];
整个程序运行,是不会crash的。但是存在内存泄露。
但是,现在又有另外一个问题,请看下列代码:
- UIView *view1=[[UIView alloc] init];
- UIView *view2=[view1 retain];
- int i=[view1 retainCount];
- NSLog(@"i:%d",i);
- [view1 release];
- view1=nil;
- [view1 addSubview:view2];
- i=[view1 retainCount];
- NSLog(@"i:%d",i);
- i=[view2 retainCount];
- NSLog(@"i:%d",i);
- [view2 release];
- i=[view2 retainCount];
- NSLog(@"i:%d",i);
请问终端输出的log应该是什么?
第一个i=2,没问题,因为view1 init了一次,retain了1次,retain值为2。
第二个i=0,根据上面所讲的推断,也没问题,因为之前view1=nil,空指针的retainCount值为0。
第三个i=1,也没什么问题,因为view2是一个被赋了值的新指针,它不同于指针view1,二者是2个独立的指针,而且,view2还被赋了值分配了内存地址。
但是,第四个i呢?i=?
答案是i=1。为什么会这样?下面是真实输出结果:
- 2011-12-09 01:17:07.364 ReleaseNildemo[19115:f803] i:2
- 2011-12-09 01:17:07.365 ReleaseNildemo[19115:f803] i:0
- 2011-12-09 01:17:07.366 ReleaseNildemo[19115:f803] i:1
- 2011-12-09 01:17:07.367 ReleaseNildemo[19115:f803] i:1
为什么会这样?按推理说,程序执行到输出这句应该crash才对,我运行了好几遍,确实没有出现。晚上在网上和其他程序员讨论这个问题,有人运行的情况是“有时候会crash,有时候不会。断点的话不会crash”,最后大家讨论的话题开始变成“系统是先输出还是先回收?”,更有甚者,有人输出了一下内存地址,发现是view2 release前后输出的是同一个内存地址,说明,这个东西内存虽然释放了,但是系统还没来得及回收。
有时候crash,原因是你向一块未申请的内存发送了一条消息,最终成了系统回收速度问题了,所以,个人认为,以后碰到类似这种问题,干脆手动init,release,至少这样能很快释放,更便于清楚当前对象的内存情况。
以上是我对release nil操作的一些理解,欢迎更多人加入讨论
Objective-C中release和nil的关系的更多相关文章
- Objective C 中的nil,Nil,NULL和NSNull理解
kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...
- Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
本文由我们团队的 康祖彬 童鞋撰写,这是他的个人主页:https://kangzubin.cn. 理解"不存在"的概念不仅仅是一个哲学的问题,也是一个实际的问题.我们是有形宇宙的居 ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- java中接口与多重继承的关系
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
- C/C++中数组与指针的关系探究
数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...
- 计算机基础--Java中int char byte的关系
计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...
随机推荐
- 同时处理html+js+jquery+css的插件安装(Spket&Aptana插件安装)
Spket 在线安装方法:Help->Software Updates(或者Install New Software)->Add site Location:http://www.spke ...
- OC .(点)与->(箭头)用法区别
这两天同学总是问OC里.和->的用法区别,当时回答的不是很好,周末查了一下,大概清楚了,在这里记录一笔. 先看这个例程 #import <Foundation/Foundation.h&g ...
- JUnit使用Eclipse建立Test Suite - 就是爱Java
当JUnit有多个或所有的Test Case要执行,此时就需要Test Suite来管理众多的Test Case,利用Eclipse的整合开发环境,可以针对多个不相关的Test Case或Test S ...
- qt 拖拽 修改大小(使用了nativeEvent和winEvent)
http://www.cnblogs.com/swarmbees/p/5621543.html http://blog.sina.com.cn/s/blog_9e59cf590102w3r6.html
- logstash 发送zabbix 给消息加上type
input { file { type => "zj_api" path => ["/data01/applog_backup/zjzc_log/zj-api ...
- USACO5.4-Character Recognition
题目大意是字符串识别一道细节很繁琐的DP,要用到很多数组一开始还真看不出是DP,后来参考了别人的代码,然后又按自己的思路重头到尾写了,虽然速度不咋的 Executing... Test 1: TEST ...
- python 标准库基础学习之开发工具部分1学习
#2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...
- Webservice-Java-CXF
1)首先呢,还是包的问题,在http://cxf.apache.org/download.html这里可以下到最新版的CXF,当然,我用的是最新版的.接下来还是那句废话,建WEB项目,放入JAR包.而 ...
- 安装tcmalloc
安装google-perftools:#tar zxvf google-perftools-1.6.tar.gz #cd google-perftools-1.6 #./configure#make# ...
- hdu1015(Safecracker )
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...