IOS开发:当过度释放一个对象时
2012-12-07 00:06
771 查看
刚才看了斯坦福大学的iPhone开发公开课的第三讲,结尾部分,指导老师运行了个retainCount的例子,这个例子让我联想到之前release过度而导致的crash问题(release写多了,蛋当时并未提示我错误,运行过去之后,在某个时间在main中crash了)。
我照着斯坦福老师敲的代码如下:
[cpp] view
plaincopy
NSString *test = [NSMutableString stringWithString:@"test retain count"];
NSLog(@"first test count is %d", [test retainCount]);
[test retain];
NSLog(@"second test count is %d", [test retainCount]);
[test release];
NSLog(@"third test count is %d", [test retainCount]);
[test release];
NSLog(@"four test count is %d", [test retainCount]);
NSLog(@"still alive");
运行结果如下:
[cpp] view
plaincopy
2012-02-29 22:51:41.217 test[14296:1203] first test count is 1
2012-02-29 22:51:41.219 test[14296:1203] second test count is 2
2012-02-29 22:51:41.219 test[14296:1203] third test count is 1
2012-02-29 22:51:41.219 test[14296:1203] four test count is -1
2012-02-29 22:51:41.220 test[14296:1203] still alive
sharedlibrary apply-load-rules all
(gdb)
可能很多童鞋和我一样被结果给弄懵了,为什么我release了test,在release的时候不报错,之后却报错呢?原因是test本身是个自动释放的对象,放在自动释放池中,当我们手动release时,它的retainCount的值虽然减一,但是并未马上调用自动释放池,当一个事件循环结束后,自动释放池中的对象被依次释放,当释放到test的时候就报错了。
之前还有过多release 手动alloc的button的时候,同样也遇到过这类问题,原因是button被addSubView等的时候,本身的retainCount被自动增加,我们release的时候并没有马上crash,当系统自动增加的retainCount都被释放的时候,再释放咱们多余的release的时候就会crash了。
个人的一点浅薄见解,如有不正确的地方,请大虾指教。
我照着斯坦福老师敲的代码如下:
[cpp] view
plaincopy
NSString *test = [NSMutableString stringWithString:@"test retain count"];
NSLog(@"first test count is %d", [test retainCount]);
[test retain];
NSLog(@"second test count is %d", [test retainCount]);
[test release];
NSLog(@"third test count is %d", [test retainCount]);
[test release];
NSLog(@"four test count is %d", [test retainCount]);
NSLog(@"still alive");
运行结果如下:
[cpp] view
plaincopy
2012-02-29 22:51:41.217 test[14296:1203] first test count is 1
2012-02-29 22:51:41.219 test[14296:1203] second test count is 2
2012-02-29 22:51:41.219 test[14296:1203] third test count is 1
2012-02-29 22:51:41.219 test[14296:1203] four test count is -1
2012-02-29 22:51:41.220 test[14296:1203] still alive
sharedlibrary apply-load-rules all
(gdb)
可能很多童鞋和我一样被结果给弄懵了,为什么我release了test,在release的时候不报错,之后却报错呢?原因是test本身是个自动释放的对象,放在自动释放池中,当我们手动release时,它的retainCount的值虽然减一,但是并未马上调用自动释放池,当一个事件循环结束后,自动释放池中的对象被依次释放,当释放到test的时候就报错了。
之前还有过多release 手动alloc的button的时候,同样也遇到过这类问题,原因是button被addSubView等的时候,本身的retainCount被自动增加,我们release的时候并没有马上crash,当系统自动增加的retainCount都被释放的时候,再释放咱们多余的release的时候就会crash了。
个人的一点浅薄见解,如有不正确的地方,请大虾指教。
相关文章推荐
- 李洪强iOS开发之宏定义方法来初始化一个单例对象
- iPhone开发--过度release一个对象会怎么样
- 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理。 例如: //实例化一个NSDateFormatter对象 NSDateFor
- ios SDK开发之关于IBOutlet对象的释放
- 李洪强iOS开发之OC[008] -创建一个对象并访问实例变量
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- QuickCSharp框架开发(12)------实现一个具体的验证提供者工厂对象AuthenticationProviderFactory
- IOS开发-ObjC-对象、封装
- ios开发中的Swift面向对象
- 一个简单的游戏开发框架(五.对象Object)
- iOS开发UI篇—实现一个私人通讯录小应用(二) - 文顶顶
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
- iOS开发用boundingRectWithSize:options:attributes:context:写的一个分类
- ios开发:一个音乐播放器的设计与实现案例
- ios开发:OC对象的内存分析
- ios开发同一个版本多次提交不想改变版本号的解决方法
- IOS开发:用命令行编译一个最简单的程序
- 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性
- 发布一个纯C语言的开发平台3(一个进程间通讯对象)
- 【ios开发工程师互联网名企面试】一个iOS程序员的BAT面试经验和知识点总结