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

Iphone 关于NSString对象和内存管理的查询,iphone,memory-management,Iphone,Memory Management,我有以下代码: NSString*tempString=[[NSString alloc]initWithFormat:@“%d/%d/%d”,日、月、年] dateString=tempString [临时字符串释放] NSLog(@“datstring和tempstring的保留计数分别为%d和%d”,[dateString重新计数],[tempstring重新计数] NSLog(@“%@和%@”、日期字符串、临时字符串) 现在它将tempString的retain计数打印为1(也是date

我有以下代码:

NSString*tempString=[[NSString alloc]initWithFormat:@“%d/%d/%d”,日、月、年]

dateString=tempString

[临时字符串释放]

NSLog(@“datstring和tempstring的保留计数分别为%d和%d”,[dateString重新计数],[tempstring重新计数]

NSLog(@“%@和%@”、日期字符串、临时字符串)

现在它将tempString的retain计数打印为1(也是dateString retain count=1),即使我在前面的行中释放了它。另外,打印这两个字符串的NSlog语句不会显示任何内容。我假设这是因为,根据我的代码,dateString指向tempString的位置,并且tempString已经释放,NSlog将无法打印该字符串。但是为什么tempString的retain计数=1呢

如果我换线

dateString=tempString

dateString=[NSString stringWithString:tempString]


然后NSlog语句打印dateString和tempString的值,并将其保留计数显示为1。当我在前一行中释放tempString时,它的值是如何打印的?

当您将释放发送到tempString时,objc运行时只调用dealloc。仅仅因为一个对象被发送了dealloc,并不意味着它在堆上的数据立即被销毁。它只是标记为稍后销毁。

阅读iphone文档:

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

正如jamapag所述,release只是告诉运行时运行
dealloc
,这意味着内存被标记为可重用,而不是被清除。对于
retainCount
为1的对象,运行时通常不会在
dealloc
之后减少
retainCount

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