我有以下代码:
NSString * tempString = [[NSString alloc] initWithFormat:@“%d /%d /%d”,日,月,年];
dateString = tempString;
[tempString release];
NSLog(@“datstring和tempstring的保留计数是%d和%d”,[dateString retainCount],[tempString retainCount]);
NSLog(@“%@ and%@”,dateString,tempString)
现在它将tempString的保留计数打印为1(同样dateString保留count = 1),即使我之前在行中释放它。打印两个字符串的NSlog语句也不显示任何内容。我假设这是因为,因为通过我的代码,dateString指向tempString的位置并且tempString已经被释放,NSlog将无法打印该字符串。但那么为什么tempString的保留计数= 1?
如果我换行
dateString = tempString;
带
dateString = [NSString stringWithString:tempString];
然后NSlog语句打印dateString和tempString的值,并将其保留计数显示为1.当我在上一行中释放tempString时,tempString的值是如何打印的?
答案 0 :(得分:2)
阅读iphone文档:
您不应该使用
retainCount
调试内存管理问题。
由于jamapag状态release
只是告诉运行时运行dealloc
,这意味着内存被标记为可重用,而不是已被清除。对于retainCount
为1的对象,运行时通常不会在retainCount
之后递减dealloc
值。
需要注意的另一件事是,您不应该像使用retainCount
那样向发布的对象发送消息,您必然会遇到一些意外行为
答案 1 :(得分:0)
当您向tempString发送版本时,objc运行时只需调用dealloc。仅仅因为已经发送了一个对象dealloc并不意味着它的数据立即被销毁。它只是稍后标记为毁灭。