关于Objective-C 对象release操作野指针的一个小问题探讨
来源:互联网 发布:c语言2017到2117闰年 编辑:程序博客网 时间:2024/05/17 23:37
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
然后写了这样一小段程序,运行
- - (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关于字符串的一个小问题
- 关于C语言的一个小问题
- 野指针的问题探讨
- oc 关于对象release后 指向它的指针如何处理的问题
- objective c 的对象指针到底是什么
- objective c 的对象指针到底是什么
- Objective-c - 野指针和僵尸对象
- 关于字符串指针初始化std::string的一个小问题
- 关于数组与指针的一个小问题
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- 指针的一个小问题
- c#中stringbuilder的使用
- cv人脸检测各函数介绍
- rsync使用笔记
- UVa 562 - Dividing coins
- Android-service详解
- 关于Objective-C 对象release操作野指针的一个小问题探讨
- tp调试笔记
- C++实现FFT代码
- linux 常用命令
- QoS/ToS/CoS/DSCP 介绍
- 第一次实验
- 简单算法--交换两个数不使用中间变量
- php 二维数组排序
- Apache+Tomcat 实现负载均衡及seesion复制实现负载均衡