objective-c - ARC 和 viewDidUnload

标签 objective-c ios cocoa-touch

如果我在我的 View 层次结构中有一个 View 的强引用,我必须在 viewDidUnload 中将它设置为 nil 还是由 ARC 处理?

最佳答案

前面两个答案中有太多错误信息,我将澄清到底是什么情况。注意这些是相对于DEPLOYMENT目标而言的,与是否使用iOS6 SDK构建无关):

  • 您不必担心 self.view - UIViewController 负责管理

  • 顶级对象——即那些不包含在另一个对象中的对象——必须是强的

  • 其他对象应该使用 weak(当它们被释放时系统 nil 是 ivar 以防止崩溃尝试使用已释放的对象)

  • 对于 iOS6 之前的设备上的部署,使用 viewDidUnload 来释放顶级对象和您想要的任何其他对象。注意:在此之后不会调用 dealloc - 当导致该消息的内存问题消失并且 View 重新出现时,您收到的下一条消息很可能是 viewDidLoad)

  • 对于 iOS6 及更高版本,不要使用 viewDidUnload(请参阅下面的编辑),如果您想释放与 View 或其他 UI 对象无关的内存,请使用 didReceiveMemoryWarning。

  • 在所有版本中都会调用 dealloc。使用 ARC,您不会像过去那样调用 super,也不会释放内存。

编辑:来自 iOS6 SDK UIViewController 类描述:

viewDidUnload Called when the controller’s view is released from memory. (Deprecated in iOS 6.0. Views are no longer purged under low-memory conditions and so this method is never called.)

Apple 所做的是删除后备存储 - 缓存像素。他们发现这消除了大部分消耗的内存,并且 viewDidUnload 的实现很差(他们在 WWDC 2012 上告诉我们这一点)。

关于objective-c - ARC 和 viewDidUnload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632036/

相关文章:

iphone - 获取实际代码中的 Xcode 项目名称

ios - 如何在 aps-environment 设置为 "production"的情况下运行我的 iOS 应用程序 (Xcode 6)?

objective-c - 如何在iOS中的UItableview中处理100000行

ios - 如何通过 API 调用实现 XCUITest

iphone - 检查特定的 UITableViewCell 在 UITableView 中是否可见

iphone - ARC 下紧密循环中 UIKit 的内存管理

cocoa-touch - 在锁定屏幕上显示警报?

objective-c - 使用元数据分块发送文件

ios - 'initwithidentifer' 之前是什么?

objective-c - 最佳实践 - iOS 中的 NSManagedObjectContextObjectsDidChangeNotification