Ios UINavigationController推送视图控制器内存管理

Ios UINavigationController推送视图控制器内存管理,ios,objective-c,memory-management,uinavigationcontroller,pushviewcontroller,Ios,Objective C,Memory Management,Uinavigationcontroller,Pushviewcontroller,我有一个UITableView,其中列出了n个联系人,并且从Table view delegate DidSelectRowatineXpath中,我正在使用UINavigationController pushviewcontroller导航到“Contactview”UIViewController 例如,如果我将第一个联系人导航到Contactview,Live Bytes内存将从1MB增加到3MB。然后,当我点击后退按钮时,会调用viewcontrollerdelloc方法,但内存仍然保

我有一个UITableView,其中列出了n个联系人,并且从Table view delegate DidSelectRowatineXpath中,我正在使用UINavigationController pushviewcontroller导航到“Contactview”UIViewController

例如,如果我将第一个联系人导航到Contactview,Live Bytes内存将从1MB增加到3MB。然后,当我点击后退按钮时,会调用viewcontrollerdelloc方法,但内存仍然保持在2.95MB到3MB之间。我的问题是当调用viewcontrollerdelloc方法时,应该释放viewcontroller的内存,对吗?我哪里错了?如果我错了,请告诉我。我正在使用ARC项目


提前谢谢

见。。有一件事ARC将在将来的某个地方发布它的内容。它是自动发布的。。如何期望ARC在类消失后进行Gatrbage收集。释放内存可能需要时间。

请参阅。。有一件事ARC将在将来的某个地方发布它的内容。它是自动发布的。。如何期望ARC在课堂结束后进行Gatrbage收集将消失。释放内存可能需要时间。

是否检查了“重新计数”?这是否显示了您想要的值?

您是否检查了重新计数?这是否显示了您想要的值?

UIImage为您缓存图像作为优化,因此这是预期的行为

如果您希望确认这种情况,为了安心,您可以强制执行低内存警告(在模拟器的硬件菜单下)。这将使UIImage抛出其缓存

您也可以使用这个私有方法,但是在提交之前当然要将它扔掉

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

UIImage为您缓存图像作为优化,因此这是预期的行为

如果您希望确认这种情况,为了安心,您可以强制执行低内存警告(在模拟器的硬件菜单下)。这将使UIImage抛出其缓存

您也可以使用这个私有方法,但是在提交之前当然要将它扔掉

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

您可能在代码的其他地方拥有视图控制器的强引用。你应该确定它是否真的被释放了。。。如果任何其他对象在导航控制器之外有对它的引用,它将不会被释放。尝试覆盖dealloc。(您也可以在ARC项目中重写dealloc,只允许您使用retain count操纵调用。)为了确保是否调用了dealloc,请在该方法中放入一些日志记录或可调试的代码

您可能在代码的其他地方拥有视图控制器的强引用。你应该确定它是否真的被释放了。。。如果任何其他对象在导航控制器之外有对它的引用,它将不会被释放。尝试覆盖dealloc。(您也可以在ARC项目中重写dealloc,只允许您使用retain count操纵调用。)为了确保是否调用了dealloc,请在该方法中放入一些日志记录或可调试的代码

如果来回推动导航,发现内存无限增长,则内存管理有问题即使使用ARC,您也可能已经放弃了内存。您可以使用Instruments中的分配模板来检测它

  • 在Instruments中,将应用程序置于众所周知的启动状态(例如,显示表视图)
  • 单击堆分析下的标记堆按钮
  • 在控制器上来回导航一次
  • 您将在分配图中看到内存使用量的小幅度增加。这是正常的,内部缓存可能存储了一些信息
  • 再次单击标记堆按钮
  • 您将在“仍然有效”列中看到许多对象
  • 多次重复步骤3-6,查看在每次迭代后是否有“仍然存在”的对象

  • 如果每个堆快照中的静止对象数量几乎恒定,请单击其中一个堆快照中的右箭头按钮,您将看到所有静止对象。查找可能由您创建的对象,选择一个,展开它,然后通过简单的单击选择其内存地址。然后单击扩展细节按钮查看堆栈跟踪,显示分配对象的位置。在这个代码上下文中,我相信您会理解内存被放弃的原因。

    如果您来回推动导航,发现内存无限增长,则内存管理有问题即使使用ARC,您也可能已经放弃了内存。您可以使用Instruments中的分配模板来检测它

  • 在Instruments中,将应用程序置于众所周知的启动状态(例如,显示表视图)
  • 单击堆分析下的标记堆按钮
  • 在控制器上来回导航一次
  • 您将在分配图中看到内存使用量的小幅度增加。这是正常的,内部缓存可能存储了一些信息
  • 再次单击标记堆按钮
  • 您将在“仍然有效”列中看到许多对象
  • 多次重复步骤3-6,查看在每次迭代后是否有“仍然存在”的对象

  • 如果每个堆快照中的静止对象数量几乎恒定,请单击其中一个堆快照中的右箭头按钮,您将看到所有静止对象。查找可能由您创建的对象,选择一个,展开它,然后通过简单的单击选择其内存地址。然后单击扩展细节按钮查看堆栈跟踪,显示分配对象的位置。有了这个代码上下文,我相信您会理解为什么您的内存被放弃。

    是的,它应该这样做。为什么不验证dealloc实际上是b