关于Objective-C 对象release操作的一个小问题探讨
2013-04-03 19:49
375 查看
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
然后写了这样一小段程序,运行
明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;
然后我们打印一下testObj对象
发现他们指向同一块地址;
testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;
然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;
唉,看到这里就应该明白了吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一步操作;
然后写了这样一小段程序,运行
- (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操作的一个小问题探讨
- 关于Objective-C 对象release操作的一个小问题探讨
- 关于Objective-C 对象release操作野指针的一个小问题探讨
- 详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
- 一个关于android数据库操作的小问题
- 关于对象在函数中delete的一个问题
- 关于C语言的文件型指针和移位操作中的一些有趣问题的探讨
- 关于form使用form.submit()提交的一个问题,提示form.submit不是对象的方法属性
- [WEB前端开发]-关于Velocity中Map与List操作-解决velocity无法识别Map对象key的问题
- 关于一个int *ptr=(int *)(&a+1)问题的探讨
- Linux内核中关于数据结构操作的一个问题
- 关于select对象在FireFox中的一个兼容性问题
- Java线程:线程的同步与锁 一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对
- 关于Access2003数据集操作的一个简单问题
- 字符集问题的初步探讨(七)----关于字符集更改的内部操作
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作
- 关于PicoBlaze 读操作的一个问题的讨论(一)