iPhone开发人员-每次都会收到记忆警告或

iPhone开发人员-每次都会收到记忆警告或,iphone,iphone-sdk-3.0,uiview,uiviewcontroller,memory-management,Iphone,Iphone Sdk 3.0,Uiview,Uiviewcontroller,Memory Management,在多视图应用程序中,您认为在内存紧张的情况下让视图自动卸载更好,还是一次只分配一个视图控制器更好,在切换视图时,会创建新视图,删除旧视图,添加新视图,释放旧视图。每次取消分配也意味着切换到新选项卡时会有轻微延迟(非常轻微)。那你觉得呢 此外,我对视图是如何、何时、何地以及由谁自动发布(通过viewDidUnload)有点困惑。如果有人能帮我澄清一下,谢谢。视情况而定,如果你有一堆用户经常打开的视图,那么我会说在那时将这些视图保留在内存中,如果有一些视图用户暂时不会回来,那么你可能可以卸载view

在多视图应用程序中,您认为在内存紧张的情况下让视图自动卸载更好,还是一次只分配一个视图控制器更好,在切换视图时,会创建新视图,删除旧视图,添加新视图,释放旧视图。每次取消分配也意味着切换到新选项卡时会有轻微延迟(非常轻微)。那你觉得呢


此外,我对视图是如何、何时、何地以及由谁自动发布(通过viewDidUnload)有点困惑。如果有人能帮我澄清一下,谢谢。

视情况而定,如果你有一堆用户经常打开的视图,那么我会说在那时将这些视图保留在内存中,如果有一些视图用户暂时不会回来,那么你可能可以卸载viewController并保存内存。但是,如果每个视图都占用大量内存,则最好在不使用viewcontroller时卸载它。这实际上是一个你多久返回一次视图,视图占用多少内存,以及你有多少视图的问题。考虑到这些因素,您应该能够很好地决定何时保留ViewController以及何时卸载它们。我相信只要ViewController还在,视图就是一个圆形的(除非你明确地释放它,这可能会有不良的副作用(不知道)),viewdidUnload只是告诉你视图已经从屏幕上卸载了,这一点不太确定。

一般来说,除非你不得不卸载视图(
direceivememorywarning
)或者它是有意义的(类似于不太可能再次使用的登录表单)

你不能真的假设你有固定的内存。iPhone的内存比iPod Touchs少。iPhone 3GS的内存比这两款都多。身陷囹圄的手机通常内存要少得多

通过在必要时发布视图,您可以让您的应用程序在3GS上运行得更快,并允许它在可用内存不足时运行

didReceiveMemoryWarning
方法在视图不可见时释放视图。以下内容来自文档(v3.x):

此函数的默认实现 方法检查视图 控制器可以安全地释放其 视图。如果视图 本身没有superview和 可以从nib文件重新加载 或者使用自定义loadView方法。如果 使用此方法可以释放视图 释放它并调用 viewDidUnload方法


显然,您还需要释放任何缓存的数据。SDK2.x没有
viewDidUnload
方法。

如果您不知道用户在它们之间切换的频率,该怎么办?您应该知道用户在屏幕上的频率,例如,用户可能会在应用程序的主菜单屏幕上出现的频率比在设置屏幕上。无论如何,您必须决定什么对您最有利。didReceiveMemoryWarning是否会在视图不可见时自动解除分配视图?因此didReceiveMemoryWarning是释放内存,而viewDidUnload是在视图被释放时释放与视图相关的所有其他内容的地方,这可能发生在didReceiveMe中mory警告如果它可以安全释放视图(触发viewDidUnload),对吗?另外,如果我的根视图控制器收到内存警告,它是否也会将其传递给所有其他视图控制器?或者应用程序中的所有视图控制器是否同时收到内存警告?