关于Objective-C 对象release操作的一个小问题探讨
2015-06-23 22:29
573 查看
转载自:http://blog.csdn.net/duxinfeng2010/article/details/8757211
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
![](http://img.my.csdn.net/uploads/201304/03/1364986101_6480.png)
然后写了这样一小段程序,运行
[cpp] view
plaincopy
- (void)viewDidLoad
{
[super viewDidLoad];
Test *testObj = [[Test alloc] init];
NSLog(@"release 前 %d",[testObj retainCount]);
[testObj release];
NSLog(@"release 后 %d",[testObj retainCount]);
}
![](http://img.my.csdn.net/uploads/201304/03/1364986169_7849.png)
明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;
然后我们打印一下testObj对象
[cpp] view
plaincopy
- (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);
}
![](http://img.my.csdn.net/uploads/201304/03/1364987275_6641.png)
发现他们指向同一块地址;
testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;
然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;
[cpp] view
plaincopy
- (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);
}
![](http://img.my.csdn.net/uploads/201304/03/1364988212_5865.png)
唉,看到这里就应该明白了吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一步操作;
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
![](http://img.my.csdn.net/uploads/201304/03/1364986101_6480.png)
然后写了这样一小段程序,运行
[cpp] view
plaincopy
- (void)viewDidLoad
{
[super viewDidLoad];
Test *testObj = [[Test alloc] init];
NSLog(@"release 前 %d",[testObj retainCount]);
[testObj release];
NSLog(@"release 后 %d",[testObj retainCount]);
}
![](http://img.my.csdn.net/uploads/201304/03/1364986169_7849.png)
明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;
然后我们打印一下testObj对象
[cpp] view
plaincopy
- (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);
}
![](http://img.my.csdn.net/uploads/201304/03/1364987275_6641.png)
发现他们指向同一块地址;
testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;
然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;
[cpp] view
plaincopy
- (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);
}
![](http://img.my.csdn.net/uploads/201304/03/1364988212_5865.png)
唉,看到这里就应该明白了吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一步操作;
相关文章推荐
- iOS开发笔记--[__NSArrayI addObjectsFromArray:]: unrecognized selector错误
- 关于 error while loading shared libraries: libXXX.so.1.2.3: cannot open shared object file: No such fi
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- Objective-C与C++的区别
- 黑马程序员——Java常用类笔记(上)【Object类/Scanner类、String类/StringBuffer类、包装类】
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)
- object-c 转换到C
- ASE Can't allocate space for object 'syslogs' in database 'WEN' because 'logsegment' segment is full
- [XCode] XCode 6给 ViewController 创建类的时候找不到 Objective C Class 选项
- a different object with the same identifier value was already associated with the session
- Region Filling and Object Removal by Exemplar-Based Image Inpainting-code-2004(代码改进)
- Effective Objective-C 2.0之Note.02
- Object.wait()与Object.notify()的用法
- Java Object.wait()方法
- Objective-C block
- Objective-C语法之NSMutableString字符串的那些事儿
- 【iOS开发之Objective-C】布尔(Boolean)类型--BOOL
- iPhone开发之object c基础一定义接口
- Object类
- OpenCV数据格式转换成Halcon数据格式HObject