如何在 Swift 中实现 didReceiveMemoryWarning?

2024-01-24

每当我创建一个新的 View Controller 子类时,Xcode 都会自动添加该方法

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}

通常我只是删除它或忽略它。这也是我见过的所有教程的做法。但我想既然 Xcode 每次都会给我它,它应该有点重要,对吧?我应该在这里做什么?我认为处置资源意味着将它们设置为零,但是“可以重新创建的资源”到底是什么?

我看到过这些问题:

  • 如何实现didReceiveMemoryWarning? https://stackoverflow.com/questions/2430728/how-to-implement-didreceivememorywarning
  • ARC环境下UIViewController的didReceiveMemoryWarning https://stackoverflow.com/questions/7766581/uiviewcontrollers-didreceivememorywarning-in-arc-environment
  • iPhone开发-模拟内存警告 https://stackoverflow.com/questions/491075/iphone-development-simulate-memory-warning

但它们都是 Swift 之前的版本。虽然我对Objective-C了解不多,但是听说内存管理是不一样的。这对我应该做什么有什么影响didReceiveMemoryWarning?

其他注意事项:

  • 我模糊地意识到自动引用计数和惰性实例化
  • The 文档 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/didReceiveMemoryWarning on didReceiveMemoryWarning我发现它相当简短。

Swift

Swift 使用 ARC 就像 Objective-C 一样(Apple 文档的来源 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)。相同类型的规则适用于释放内存,删除对对象的所有引用,并且该对象将被释放。

如何释放内存

我认为处置资源意味着将它们设置为零,但是“可以重新创建的资源”到底是什么?

“可以重新创建的资源”实际上取决于您的应用程序。

Examples

假设您是一个处理大量图片的社交媒体应用程序。您想要一个活泼的用户界面,因此您将接下来的 20 张图片缓存在内存中,以便快速滚动。这些图像始终保存在本地文件系统上。

  • 图像会占用大量内存
  • 您不需要内存中的这些图像。如果应用程序内存不足,多花一秒钟从文件加载图像就可以了。
  • 当您收到该内存警告时,您可以完全转储图像缓存。
  • 这将释放系统所需的内存

您正在创建一个具有多个不同级别的精彩游戏。 将一个关卡加载到您精美的游戏引擎中需要一段时间,因此如果用户有足够的内存,您可以在玩第 2 关时加载第 3 关。

  • 关卡占用大量内存
  • 你不需要更高级别的记忆。它们很高兴拥有,但不是必需的。
  • LevelCache.sharedCache().nextLevel = nil释放所有内存

你不应该取消分配什么

切勿取消分配屏幕上的内容。我已经看到一些相关问题的答案取消了 UIViewController 的视图分配。如果你从屏幕上删除所有内容,你很可能会崩溃(在我看来)。

Examples

如果用户打开了正在编辑的文档,请勿取消分配它。如果您的应用程序在没有保存的情况下删除了他们的工作,用户会对您非常生气。 (事实上​​,当发生这种情况时,你可能应该有一些紧急保存机制)

如果您的用户正在为您出色的社交媒体应用程序撰写帖子,请不要浪费他们的工作。保存它并在他们再次打开应用程序时尝试恢复它。尽管设置工作量很大,但我喜欢执行此操作的应用程序。

Note

大多数现代设备很少会出现内存不足的情况。该系统在杀死后台应用程序以释放内存给前台运行的应用程序方面做得非常好。 您可能已经在应用程序切换器中看到一个应用程序“打开”,但当您点击该应用程序时,它会打开到其初始状态。操作系统在后台杀死了该应用程序以释放内存。看国家恢复 https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforImplementingYourApp/StrategiesforImplementingYourApp.html有关如何避免此问题的信息。

如果您的应用程序在没有进行大量处理时收到一致的内存警告,请首先确保您没有泄漏内存。 检测内存泄漏超出了本答案的范围。Docs https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html and a tutorial http://www.raywenderlich.com/2696/instruments-tutorial-for-ios-how-to-debug-memory-leaks.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中实现 didReceiveMemoryWarning? 的相关文章

  • 如何将任意颜色的色度键滤镜应用到实时摄像头源ios?

    基本上我想将色度键滤镜应用到 ios 实时摄像头源 但我希望用户选择将被另一种颜色替换的颜色 我找到了一些使用绿屏的示例 但我不知道如何动态替换颜色而不仅仅是绿色 知道如何以最佳性能实现这一目标吗 您之前曾询问过我的情况GPUImage h
  • 如何在iOS应用程序中实现信号量?

    是否可以在ios应用程序中实现计数信号量 对的 这是可能的 有很多可用的同步工具 同步 NSLock NS条件 NS条件锁 GCD 信号量 并行线程锁 我建议阅读 线程编程指南 http developer apple com librar
  • UIButton 触摸事件落入底层视图

    我创建了一个小UIView其中包含两个UIButton是 视图响应UITapGesture事件 按钮应该响应TouchUpInside 但是当我点击按钮时 响应者是底层视图 并且点击手势选择器被触发 寻找意见或建议 您可以修改橙色视图中响应
  • 在 UILongPressGestureRecognizer 上,如何检测哪个对象生成了事件?

    我有几个 UIButton 的视图 我已成功使用 UILongPressGestureRecognizer 实现 并使用以下内容作为选择器 void longPress UILongPressGestureRecognizer gestur
  • iOS 中输入字段显示不同大小

    我有一个带有背景和固定宽度 高度的输入字段 它在我桌面上的所有浏览器中看起来都很好 但由于某种原因 它看起来更大iPad and iPhone 我在 CSS 中尝试了一些技巧 但到目前为止没有任何效果 width 120px importa
  • UIButton 上的圆形渐变边框

    您好 我一直在尝试在我的应用程序中实现一个 UIButton 它具有圆角和渐变边框 我使用以下代码在按钮上创建渐变边框 let gradient CAGradientLayer gradient frame CGRect origin CG
  • IBDesignable 和 UITableViewCell

    我正在尝试利用 XCode 6 中 Swift 的 IBDesignable 功能来创建 UITableViewCell 的子类 我在 WWDC 演示和网络上看到 您可以使用框架来创建视图 UIView 的子类 然后可以将其用于自定义 UI
  • 在 SwiftUI App 中实现深色模式切换

    我目前正在我的应用程序中研究深色模式 虽然由于我的 SwiftUI 基础 深色模式本身并不困难 但我正在努力选择将 ColorScheme 设置为独立于系统 ColorScheme 的选项 我在苹果人机界面指南中找到了这一点 https i
  • 在选择器视图中为行实现的标题没有改变字体?

    我尝试更改选择器视图中标题的字体 但由于某种原因我不能 我可以更改标题的颜色 但字体保持不变 func pickerView pickerView UIPickerView attributedTitleForRow row Int for
  • IOS Swift 从数组中搜索表

    我刚刚开始学习 swift 我正在研究 tableview 和 searchbar 功能 下面我有我的数组 它是水果列表 var fruits String Apple Green Pear Green Banana Yellow Oran
  • SwiftUI ScrollView 只向一个方向滚动

    尝试使用视图作为列表行样式来创建自定义列表 以摆脱默认情况下列表中难看的分隔线 但是 一旦我将 ZStack 行放入滚动视图中 滚动视图就会在两个方向上滚动 而不仅仅是垂直滚动 这是内容视图 NavigationView ScrollVie
  • 在 iPhone 5 的横向模式下启动启动画面

    我们的通用应用程序仅适用于横向模式 我们需要为 iPhone 4 和 iPhone 5 添加启动画面 对于 iPhone 5 的肖像 我们使用 email protected cdn cgi l email protection 如何为 i
  • 如何使用自定义布局跳转到 UICollectionView 中的任何 Cell?

    我的水平 UICollectionView 中有 40 个单元格和一个按钮 当我点击按钮时 我可以从 5 号单元格跳转到 10 号单元格 但是一旦我想要转到另一个单元格 例如从 5 到 25 它不起作用 而是变为 0 code func s
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • GIDSignIn 在提示前指定范围

    我在 iOS 上升级到 GoogleSignIn 6 0 但找不到在登录时指定登录范围的方法 我只能看到一个名为 addScopes 的 API 我可以在基本登录后指定范围 但这会导致两个单独的登录提示 这很奇怪 之前 我们可以简单地指定登
  • 如何将图像放在 UIButton 中文本的右侧?

    如果可以避免的话 我不想使用子视图 我想要一个UIButton其中包含背景图像 文本和图像 现在 当我这样做时 图像位于文本的左侧 背景图像 文本和图像都有不同的高亮状态 最简单的解决方案 iOS 10 及更高版本 Swift button
  • Swift 中的 AURenderCallback

    我正在创建一个使用音频单元的应用程序 虽然 Objective C 中有很多代码示例 包括 Apple 自己的 aurioTouch 等 但我正在尝试用 Swift 编写整个代码 我已经能够设置我的 AUGraph 并通过它运行一些音频 但
  • 如何区分iphone4和iphone 3

    我正在尝试使用 cocos2d 引擎为 iphone 构建游戏 我想知道如何区分用户使用的是 iphone 4 还是 iphone 3 因为我想为 iphone4 加载高分辨率图形 为 iphone 3 加载低分辨率图形 我知道我是否在以下
  • NSRange 到 Range

    我怎样才能转换NSRange to Range

随机推荐