Iphone 关于NSString对象和内存管理的查询
我有以下代码: 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]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
然后NSlog语句打印dateString和tempString的值,并将其保留计数显示为1。当我在前一行中释放tempString时,它的值是如何打印的?当您将释放发送到tempString时,objc运行时只调用dealloc。仅仅因为一个对象被发送了dealloc,并不意味着它在堆上的数据立即被销毁。它只是标记为稍后销毁。阅读iphone文档: 您不应使用
retainCount
来
调试内存管理问题
正如jamapag所述,release只是告诉运行时运行dealloc
,这意味着内存被标记为可重用,而不是被清除。对于retainCount
为1的对象,运行时通常不会在dealloc
之后减少retainCount
值
另一件需要注意的事情是,您不应该像使用retainCount
时那样向已发布的对象发送消息,您肯定会遇到一些意外的行为