有关NSString对象和内存管理的查询

时间:2010-08-04 09:29:45

标签: iphone memory-management

我有以下代码:

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的值是如何打印的?

2 个答案:

答案 0 :(得分:2)

阅读iphone文档:

  

您不应该使用retainCount   调试内存管理问题。

由于jamapag状态release只是告诉运行时运行dealloc,这意味着内存被标记为可重用,而不是已被清除。对于retainCount为1的对象,运行时通常不会在retainCount之后递减dealloc值。

需要注意的另一件事是,您不应该像使用retainCount那样向发布的对象发送消息,您必然会遇到一些意外行为

答案 1 :(得分:0)

当您向tempString发送版本时,objc运行时只需调用dealloc。仅仅因为已经发送了一个对象dealloc并不意味着它的数据立即被销毁。它只是稍后标记为毁灭。