刚才看了斯坦福大学的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 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了。
个人的一点浅薄见解,如有不正确的地方,请大虾指教。