我在为iPhone模拟器(或设备)编译的Xcode项目中看到的以下行为让我感到困惑:
NSString *test = [[NSString alloc] initWithCString:"foo"]; NSLog(@"test retain count = %d", [test retainCount]); // prints 1 [test release]; NSLog(@"test retain count = %d", [test retainCount]); // also prints 1 instead of 0
但是,任何进一步尝试访问'test'都会导致Xcode环境崩溃,无论是另一个[test retainCount]
NSLog语句还是其他方式(即使只检查测试是否等于nil).
思考?在一个简单的基于视图的测试项目中编译...代码存在于项目的applicationDidFinishLaunching方法中.
澄清 - 我知道不要在实践中做上述事情.这只是一个测试,看看为什么在某些调试情况下,保留计数为1实际上并不反映对象的实际状态.谢谢你的回复.这只是一个测试存根,看看为什么我在一些情况下看到某些行为.我真正想要做的是追踪每当我销毁/重新创建自定义视图时始终创建的非常小的内存泄漏(0.06MB).
保留计数是一种调试辅助工具,根据Cocoa在幕后可能做的事情可能会产生误导.对于字符串文字尤其如此,其中数据永久可用且永远不会被真正删除.
集中精力确保您的代码遵循关于对象所有权的Cocoa内存管理规则.必要时,使用Instruments检查实际的内存泄漏.
要调用retainCount
上test
后,它已被释放,并可能释放,所以肯定结果是不可靠的,别说你不应该发送dealloced对象的任何消息.