iphone - 在 didReceiveMemoryWarning 之后我应该用什么方法重新创建资源?

标签 iphone ios memory-management uiviewcontroller

我有一个 View Controller ,它有一个私有(private)的 NSArray 变量。该变量在 viewDidLoad 方法中初始化。当调用 didReceiveMemoryWarning 时会出现一些问题:

  1. 我应该将私有(private)变量设置为 nil 吗?
  2. 如果我将它设置为 nil,必须用什么方法重新创建它? View Controller 是否调用 viewDidLoad 方法重新创建它?

我问是因为 View 的其他方法需要这个变量,如果它是 nil 就不会工作。

谢谢!

最佳答案

通常,您通过 setter 分配 nil 来卸载私有(private)属性(例如 self.propertyName = nil)。或者您可以在调用 release 后将 ivar 设置为 nil,例如[_propertyName 发布]; _propertyName = nil;,但前者更可取。

didReceiveMemoryWarning 方法在内存不足的情况下被调用。它在每个 View Controller 上调用,包括负责当前可见 UI 的 View Controller !

因此,当您收到对 didReceiveMemoryWarning 的调用时,您不能随意卸载数据——如果该数据当前在显示器上可见,则 View Controller 可能需要该数据。

一般原则是 didReceiveMemoryWarning 可以摆脱它可以帮助释放内存的任何资源,但仅限那些不是立即需要的资源。例如,在 OpenGL 游戏中,您不会卸载当前在显示器上可见的纹理。但是,请参阅我的最后一段。

通常,您会在需要时通过检查资源是否已加载来重新加载资源,如果没有,则加载它们。

不值得释放/释放微小的资源,例如单个正常大小的字符串。您应该专注于占用大量内存的项目。

幕后内存管理的最新进展意味着这些天您不太可能需要实际卸载数据 - 操作系统可以在幕后卸载和重新加载未压缩的图像数据等。

正如 Hot Licks 提到的,模拟器有一个模拟内存警告的选项。值得在您的应用程序的不同点触发此内存警告,以查看它的行为方式。

关于iphone - 在 didReceiveMemoryWarning 之后我应该用什么方法重新创建资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854717/

相关文章:

iphone - 尝试在 View 之间切换时会看到白屏!

iphone - UIWebView 不会加载带有证书的链接 (https ://prefix)

javascript - 检测客户端是否允许 HTML5 视频的内​​联媒体播放

c++ - 未分配正在释放的指针,动态数组 C++

c++ - 删除 vector 中的元素,该元素使用 'new' 运算符分配

iOS 内存分配问题和 RIPZoneDataAlloc

苹果手机锁屏

iphone - CAAnimation 在滚动出界时停止

ios - 编码复杂对象 swift 3.0

objective-c - iPhone的简单动画