Objective c 自动参考计数与UINavigationController

Objective c 自动参考计数与UINavigationController,objective-c,ios,uinavigationcontroller,automatic-ref-counting,Objective C,Ios,Uinavigationcontroller,Automatic Ref Counting,我对UINavigationController与ARC(自动参考计数)的结合有一个非常奇怪的问题。 我有一个带有UIViewController的iPad应用程序,它包含一个带有一些子视图的视图。 它的视图中有一个UIScrollView(至少有5个子视图),还有2个简单视图,一个黑条和一个白条 每当我在UINavigationController堆栈(比如WebView)上推送某些内容时,我会收到一条内存警告,UINavigationController会在其堆栈上的所有当前和以前的UIVi

我对UINavigationController与ARC(自动参考计数)的结合有一个非常奇怪的问题。 我有一个带有UIViewController的iPad应用程序,它包含一个带有一些子视图的视图。 它的视图中有一个UIScrollView(至少有5个子视图),还有2个简单视图,一个黑条和一个白条

每当我在UINavigationController堆栈(比如WebView)上推送某些内容时,我会收到一条内存警告,UINavigationController会在其堆栈上的所有当前和以前的UIViewController上调用ViewDidLoad

现在问题来了,当我从堆栈中弹出WebView时,我带着scrollview返回UIViewController,它就消失了! 它完全被遮住了

我怀疑-didReceiveMemoryWarning方法会在启用ARC后隐藏一些东西。如何强制ARC保持此特定的ViewController

有人能帮我吗?因为此刻我真的很烦

非常感谢


-B

看起来您在web视图中加载了一些非常沉重的内容,导致内存警告(或者您正在执行其他导致内存不足的操作)。UINavigationController接收
-didReceiveMemoryWarning
并将其转发给卸载视图的所有视图控制器(->
viewDidUnload
告诉您释放不想留在内存中的内容。ARC不包括这一点,因此您必须清除所有与视图相关的内容)。 返回时,将调用
loadView
viewDidLoad
。您可能没有完全恢复视图,尤其是滚动视图,以匹配内存警告之前的状态。

请记住,与以前的iOS版本相比,iOS 5内存警告出现的频率较低(操作系统会尝试为您释放尽可能多的内存),但当您收到内存警告时,这是您最后一次保持活动状态的机会。

看起来您在web视图中加载了一些非常沉重的内容,导致内存警告(或者您正在执行其他导致内存不足的操作)。UINavigationController接收
-didReceiveMemoryWarning
,并将其转发给卸载视图的所有视图控制器(>
viewDidUnload
告诉您释放不想留在内存中的内容。ARC不包括这一点,因此您必须消除与视图相关的所有内容)。 返回时,将调用
loadView
viewDidLoad
。您可能没有完全恢复视图,尤其是滚动视图,以匹配它们在内存警告之前的状态。

请记住,与以前的iOS版本相比,iOS 5内存警告出现的频率较低(操作系统会尝试为您释放尽可能多的内存)但是当您收到内存警告时,这是您最后一次保持活动状态的机会。

您是如何创建滚动视图的内容的?当您加载类似web视图的内容时,删除这些内容是完全正常的,并且取决于它们的创建方式,当您返回视图时,可能不会自动重新创建它们。这并不正确与ARC有任何关系,这只是内存管理在iOS上的工作方式(如果出现内存不足警告,而您不释放一些内存,您的应用程序将崩溃)。您可以使用“硬件->模拟内存警告”进行测试在iOS模拟器中。你是如何创建滚动视图的内容的?当你加载web视图之类的内容时删除这些内容是完全正常的,并且根据它们的创建方式,当你返回视图时,它们可能不会自动重新创建。这与ARC无关,只是内存管理的方式在iOS上工作(如果出现内存不足警告,而您没有释放一些内存,您的应用程序将崩溃)。您可以使用“硬件->模拟内存警告”进行测试在iOS模拟器中。内存密集型的东西发生在scrollview中,它主要加载5个子视图,其中包含相当大的背景图像,以获得出色的视觉内容。iPad2完美地解决了这一问题,这个错误只发生在iPad1上。因此,每当我弹回scrollview时,我都会被要求恢复scrollview,这应该在viewDidL中完成我认为加载方法?我已经完成了上面提到的事情,而且似乎很有效。非常感谢!:大型背景图像可能很危险…(尤其是JPG图像)当你想缩放时,你可以使用CATEDLE层来懒惰地加载不同的缩放级别。在顶层滚动视图中,你不应该有超过2个活动的CATIDELAY/UIIVIEVIEW对象——也许你应该考虑重用视图(如UITababVIEW为单元格做的事)来保存内存。高级滚动视图技术上的WWDC 2010视频覆盖了:它们是PNG文件,我没有缩放,所以平铺的东西对我来说有点过时。但我有另一个关于这个错误的问题:内存不足警告的最佳做法是什么?删除所有子视图并在didReceiveMemoryWarning中将它们设置为零,然后在viewDidUnload中将它们设置为零,或者..其他什么?内存在在scrollview中会出现紧张的内容,它主要加载5个子视图,其中包含相当大的背景图像,以获得出色的视觉内容。iPad2完美地解决了这一问题,这个错误只发生在iPad1上。因此,每当我弹回来时,我都会被要求恢复scrollview,我想这应该用viewDidLoad方法完成?我已经完成了a上面提到的东西似乎很有效。谢谢大家!大型背景图片可能很危险(尤其是JPG图片)当你想缩放时,你可以使用CATEDLE层来懒惰地加载不同的缩放级别。在顶层滚动视图中,你不应该有超过2个活动的CATIDELATE/UIIVIEVIEW对象——也许你应该考虑重用视图(如UITababVIEW为单元格做的事情)来保存内存。