关于Objective-C 对象release操作的一个小问题探讨
来源:互联网 发布:mac os x10.12镜像下载 编辑:程序博客网 时间:2024/06/09 13:23
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
然后写了这样一小段程序,运行
- (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操作的一个小问题探讨
- 关于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用mdev实现U盘自动挂载
- extjs定时刷新EditorGridPanel中的某一列
- 推荐视觉跟踪领域的几个研究者
- 奇怪的面试题
- ios6 处理内存警告
- 关于Objective-C 对象release操作的一个小问题探讨
- 使用c++11标准库转换字符编码
- Error:"No method with signature" in OAF
- jta和两阶段提交
- 计算标准体重
- PHP有9个预定义变量数组,分别总结如下
- 房贷收益计算
- 黑马程序员-类加载器
- C++中的explicit作用功能(防止隐式转换)