关于Objective-C 对象release操作的一个小问题探讨
来源:http://blog.csdn.net/duxinfeng2010/article/details/8757211
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的

然后写了这样一小段程序,运行
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- Test *testObj = [[Test alloc] init];
- NSLog(@"release 前 %d",[testObj retainCount]);
- [testObj release];
- NSLog(@"release 后 %d",[testObj retainCount]);
- }

明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;
然后我们打印一下testObj对象
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- Test *testObj = [[Test alloc] init];
- NSLog(@"release 前 %d",[testObj retainCount]);
- NSLog(@"testObj release指向-->%@",testObj);
- [testObj release];
- NSLog(@"release 后 %d",[testObj retainCount]);
- NSLog(@"testObj release指向-->%@",testObj);
- }

发现他们指向同一块地址;
testObj
在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不
存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;
然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- Test *testObj = [[Test alloc] init];
- NSLog(@"release 前 %d",[testObj retainCount]);
- NSLog(@"testObj release指向-->%@",testObj);
- [testObj release];
- testObj = nil;
- NSLog(@"release 后 %d",[testObj retainCount]);
- NSLog(@"testObj release指向-->%@",testObj);
- }

唉,看到这里就应该明白了
吧,[testObj release]
后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该
记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一
步操作;
关于Objective-C 对象release操作的一个小问题探讨的更多相关文章
- 为什么使用eval()将json字符串转换为对象要多加一个小括号
使用eval()将json字符串转换为对象要多加一个小括号: 关于eval()函数的具体用法这里就不多介绍了,具体可以参阅javascript的eval()方法一章节,下面就介绍一下为什么使用eval ...
- DOM操作的一个小坑
最近在苦读<JavaScript高级程序教程>,真不愧是前端圣经,学到了很多东西. nodeList.NameNodeMap.HTMLCollection这三个集合是动态的!每当文档发生变 ...
- DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)
一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...
- [转]一个小试验验证对象的指针计数置为nil的情况
本文转载于新风作浪的博客专栏,博客地址:http://blog.csdn.net/duxinfeng2010/article/details/8757211 以下博客原文: 最近遇到这样一个问题,以前 ...
- jQuery对象的操作
参考一篇不错的文章:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object 1. ...
- Javascript对象赋值操作
首先,我们还是举个例子来说明对象赋值操作的问题吧: ps: 本文默认约定log = console.log function A(){} A.prototype.x = 10; var a1 = ne ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- string 对象及其操作
标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中.接下来的示例都假定了已包 ...
- 关于DOM中的model(将元素转成对象进行操作)
DOM document (html, xml) object 将文档中的HTML元素转成js的对象 通过ID找到文档的元素转成js对象 var obj = document.getElementBy ...
随机推荐
- AWR分析。(shared_pool,sga_size大小设置)
Execute to Parse 指标反映了执行解析比 其公式为 1-(parse/execute) , 目标为100% 及接近于只 执行而不解析 在oracle中解析往往是执行的先提工作,但是通过游 ...
- APK软件反编译 去广告
具体步骤: 1.下载 apktool 下载地址:https://code.google.com/p/android-apktool/downloads/list 2.通过apktool 反编译apk. ...
- c++中的dictionary对象:map的使用备忘
#include <map> #include <iostream> using namespace std; void main(){ map <string, int ...
- 005. C#发送邮件
/// <summary> /// 发送邮件 /// </summary> /// <param name="toEmailS">邮件接收者列表 ...
- pam
http://www.linux-pam.org/ sag(the linux-pam system administrators' guide)翻译(以下是网上别人的翻译,参考一下) http:// ...
- linux服务之upstart与systemd
http://blog.fens.me/linux-upstart/ rpm -ql initscripts|more [root@84-monitor init]# rpm -qf /etc/ini ...
- CSS控制print打印样式
来源:http://blog.csdn.net/pangni/article/details/6224533 一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示: 用于屏幕显 ...
- 通过命令行安装Android app
手动安装安卓app的命令为:adb install -r C:\Users\Lihao\workspace\Appium_Demo\apps\app_F_1.3.0.apk
- android 旋转手机的时候,如何忽略onCreate再次被系统调用?
实现一个程序,主要是不想在手机横竖屏的时候重新onCreate,所以在配置文件中增加了配置选项: android:configChanges="orientation|keyboardHid ...
- ORACLE 事务学习
以下内容为本人的学习手记,有不足和理解错误的地方,请谨慎参考. 在ORACLE中的事务并不像MSSQL中的事务那样可以随意控制. ORACLE的事务是在进行数据第一次被修改后自动开启的无法显示的开启事 ...