关于Objective-C 对象release操作的一个小问题探讨
来源:互联网 发布:淘宝店铺要交税吗 编辑:程序博客网 时间:2024/05/22 14:32
转载自: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这一步操作;
1 0
- 关于Objective-C 对象release操作的一个小问题探讨
- 关于Objective-C 对象release操作野指针的一个小问题探讨
- 关于Objective-C 对象release操作的一个小问题探讨
- 关于Objective-C 对象release操作的一个小问题探讨
- C关于字符串的一个小问题
- 关于C语言的一个小问题
- 一个关于乘法溢出问题的探讨
- 探讨一个关于“继承”的问题
- 关于题目“DATAbase, ACM/ICPC NEERC 2009, UVa1592”的一个小问题探讨
- 一个关于android数据库操作的小问题
- Mybatis中的一个关于日期操作的小问题
- 关于C语言的文件型指针和移位操作中的一些有趣问题的探讨
- 关于《c语言的一个小问题》的补充
- 关于C++的一个小问题
- 【C语言】一个关于if的小问题
- objective-c 内存管理之 "autorelease"的疑问 ---何时release对象(转)
- C的一个小问题
- Objective-C 【NSFileManager 的用法深入探讨】
- linux程序调试命令addr2line之入门简介(本文先不聊gdb调试)
- C语言-求数字阶乘(递归函数)
- 一些Python代码
- [2014-08-17 17:04:49 - ddms] transfer error: Invalid argument [2014-08-17 17:04:49] Failed to push s
- UML类图与类的关系详解
- 关于Objective-C 对象release操作的一个小问题探讨
- 题目7:找出第10001个质数。
- KVO的底层实现原理
- android图片处理方法
- Java基础之多线程2
- HALCON11+VS2012配置
- Linux系统下挂载光盘
- POJ 3321 Apple Tree(DFS序 ,修改节点值,子树求和)
- 11.Eclipse安装了genymotion 没有图标显示?