我有一个 View Controller ,它有一个私有(private)的 NSArray
变量。该变量在 viewDidLoad
方法中初始化。当调用 didReceiveMemoryWarning
时会出现一些问题:
- 我应该将私有(private)变量设置为
nil
吗? - 如果我将它设置为
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/