iPhone开发--过度release一个对象会怎么样

来源:互联网 发布:数据库规划方案 编辑:程序博客网 时间:2024/04/26 04:06

刚才看了斯坦福大学的iPhone开发公开课的第三讲,结尾部分,指导老师运行了个retainCount的例子,这个例子让我联想到之前release过度而导致的crash问题(release写多了,蛋当时并未提示我错误,运行过去之后,在某个时间在main中crash了)。

我照着斯坦福老师敲的代码如下:

    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");

运行结果如下:

2012-02-29 22:51:41.217 test[14296:1203] first test count is 12012-02-29 22:51:41.219 test[14296:1203] second test count is 22012-02-29 22:51:41.219 test[14296:1203] third test count is 12012-02-29 22:51:41.219 test[14296:1203] four test count is -12012-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了。

个人的一点浅薄见解,如有不正确的地方,请大虾指教。

原创粉丝点击