在iOS中,使用ARC,将所有ivars和属性设置为nil,并在viewDidUnload中释放上下文、图像、颜色空间是否足够?

2024-04-02

对于使用 ARC 的 iOS 应用程序,我们通常会在以下位置发布这些应用程序吗?viewDidUnload?

  1. 将所有实例变量设置为nil

  2. 将所有属性设置为nil

  3. 使用释放任何上下文CGContextRelease, CG图像与CGImageRelease,以及色彩空间CGColorSpaceRelease(释放任何非对象)

  4. 不需要特别注意NSMutableArray of NSSetelements:只要将NSMutableArray和NSSet的引用设置为nil,每个元素就会自动释放。

这样做会处理 ARC 下的大部分内存释放吗?还有其他项目需要发布吗?


很多人都误解了重点viewDidUnload。特别是,它是not对应于viewDidLoad。在大多数情况下,您的视图控制器将被释放而无需viewDidUnload被召唤。为此,您应该never考虑取消分配viewDidUnload分配的适当平衡viewDidLoad.

viewDidUnload已被 Apple 弃用。反对使用它的最佳论点可能是它的标题(我已经包装了):

- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view
    // controller's view is released and set to nil. For example, a memory warning
    // which causes the view to be purged. Not invoked as a result of -dealloc.`

那么什么是viewDidUnload?其背后的想法是视图从视图控制器后面卸载。这使您有机会分离指向它的任何指针并清除可以轻松重建的任何信息。你的观点将probably被重新加载,此时您需要重建所有缓存。苹果公司是这样描述的:

当发生内存不足的情况并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,并且是您执行任何最终清理的机会。如果您的视图控制器存储对视图或其子视图的单独引用,则应使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但由于视图消失而不再需要的任何对象的引用。您不应使用此方法来发布用户数据或任何其他无法轻松重新创建的信息。

请记住,将对对象的引用归零viewDidUnload现在应该没有必要了。如果您按照 Apple 的建议使用 ARC,则您的视图出口会将弱引用归零。不用你写,它们就会自动被清空viewDidUnload!

此外,清除缓存信息更适合didReceiveMemoryWarning,所以你可能应该这样写:

您可以覆盖此方法以释放视图控制器使用的任何额外内存。如果这样做,此方法的实现必须在某个时刻调用超级实现,以允许视图控制器释放其视图。如果你的视图控制器持有对视图层次结构中视图的引用,你应该在viewDidUnload方法代替。

一般来说,人们放入的东西viewDidUnload更好地处理在viewDidDisappear or dealloc。唯一剩下的就是viewDidUnload使任何一个为零your当视图控制器仍然打开时,可以在视图重新加载后的某个时刻需要时重建缓存,而不会丢失数据。 (并且,再次,这应该在didReceiveMemoryWarning.) 这些缓存应该是惰性构建的;当您的应用程序再次需要它们时,它会悄悄地重建它们。

那么你应该做什么viewDidUnload?如果您使用 ARC:什么也没有。连写都不用写。事实上,自从写这个答案以来,苹果已经弃用了viewDidUnload.

For CGContextRelease, the CGContext资源不是 Objective-C 对象。 (你指出了这一点,但我想为后代重复一遍。)因此,它不能被 ARC 自动释放。您负责确保它被释放并被置空,就像旧的手动保留释放(MRR)内存管理方案一样。

如果你把这段代码放入viewDidUnload,不能保证它会被调用。必须要进去dealloc. You could把它放进去viewDidUnload也一样,但是……

And so:

  1. 没有必要或没有帮助。与视图层次结构相比,您的实例变量很小。
  2. 没有必要或没有帮助。与视图层次结构相比,您的属性是微不足道的(只要您的属性不是对视图层次结构的强引用)。
  3. 这会导致内存泄漏,因为dealloc通常会被调用而无需viewDidUnload.
  4. 没有必要或没有帮助。参见第 1 点和第 2 点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在iOS中,使用ARC,将所有ivars和属性设置为nil,并在viewDidUnload中释放上下文、图像、颜色空间是否足够? 的相关文章

  • [UIScreen mainScreen].bounds.size 在 iOS8 中变得依赖于方向吗?

    我在 iOS 7 和 iOS 8 中运行了以下代码 UIInterfaceOrientation orientation UIApplication sharedApplication statusBarOrientation BOOL l
  • 设置 TableView setEditing 时无法选择 UITableViewCell

    我希望能够选择多行 如下所示的默认邮件应用程序 我有一个名为编辑的按钮 可以调用 self myTableView setEditing YES animated YES 编辑按钮成功显示单元格左侧的圆圈 如上所示的邮件应用程序 但是 当我
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • Objective-C 中 typedef 枚举语句在哪里?

    我担心的一个基本问题 以下代码有效 并且 typedef 枚举被识别 但我收到一条警告消息 空声明中无用的存储类说明符 我在这里做错了什么吗 这是放置 typedef 枚举的最佳位置吗 import
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • 使用自动布局约束时如何获取视图的当前宽度和高度?

    我不是在谈论frame属性 因为从中你只能得到xib中视图的大小 我说的是当视图由于其约束而调整大小时 可能在旋转之后 或响应事件 有没有办法获取当前的宽度和高度 我尝试迭代其约束来寻找宽度和高度约束 但这不是很干净 并且在存在内在约束时会
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行
  • Facebook iOS SDK:登录 Facebook 时无需总是询问应用程序的权限

    我在我的应用程序中使用 Facebook iOS SDK 我有两个类似的问题 有没有办法知道当前是否有用户登录 我现在使用的是在成功登录时存储访问令牌和到期日期 并在应用程序启动时加载它们 我的问题是 如果会话无效 我可以为用户提供登录选项
  • CoreBluetooth:如何为许多特性(30 - 40)设计代码?

    我搜索了一下 发现这是一个可能重复的问题 同一设备的多个 CBPeripheral https stackoverflow com questions 10836703 multiple cbperipherals for same dev
  • 斯威夫特/iOS。从导航堆栈中删除一些视图控制器

    这是我想做的 但我不确定这是否是正确的方法 所以请给我建议如何去做 我有初始 VC 和导航 VC 我从中推送第一个 VC 从中推送第二个 VC 接下来我介绍 来自第二个 VC 的 NavigationController 第三个 VC 现在
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 如何在 xcode 中使用相同的 nib 文件创建多个窗口

    我有一个使用表格视图作为界面的 iPhone 应用程序 每次用户点击其中一个表格单元格时 我想向用户显示另一个窗口 然而 我推入导航控制器的窗口的用户界面非常相似 因此 我决定制作一个 通用 nib 文件 以便在该通用 nib 文件的文件所
  • xcode 4 垃圾收集已删除?

    我正在学习 Xcode 和 Objective C 但是我正在阅读的书使用的是旧版本 3 2 的 Xcode 其中一章完全致力于内存和泄漏 说我需要通过 项目设置 gt 构建 打开垃圾收集 但是 我找不到垃圾收集设置 它已被删除还是我只是错
  • 在 iPhone 中保存会话数据

    我想将数据存储在应用程序中的不同点 以便应用程序中的对象可以访问这些数据 类似于 php 中的 session 或全局变量 我知道我可以使用 NSUserDefaults 但我不确定如何继续向它添加值然后访问它 例如 首先我想存储登录期间使
  • Apple 允许后台任务运行多长时间?

    我必须将一系列图像文件上传到数据库 因此 我偶然发现苹果后台执行指南 https developer apple com library ios documentation iPhone Conceptual iPhoneOSProgram
  • 如何在 UITableViewCell 上使用自定义初始值设定项?

    我有一个自定义 UITableViewCell 我想在我的表视图中使用它 这是我的单元格代码 class ReflectionCell UITableViewCell IBOutlet weak var header UILabel IBO
  • 自定义事件多久才会出现?

    我正在尝试使用 Flurry 将分析跟踪添加到 iPhone 应用程序 我已经连接了 Flurry 并且它似乎可以很好地跟踪会话和使用情况 但是 我刚刚尝试添加自定义事件日志 但每当我查看 Flurry 分析 事件 页面时 它都会告诉我 您
  • Dropbox API - 使用 Dropbox 作为服务器

    我想使用文件共享服务器来使某些文件在多台计算机上的应用程序的多个实例中保持最新和恒定 例如 例如 编写多人游戏 它将所有玩家的位置存储在文本文件中 并使用 Dropbox 之类的工具在所有应用程序中保持文本文件不变 每个应用程序实例都可以根
  • 应用程序被终止时是否会收到 iOS 静默通知

    当发送后台推送时 content available 1 对于被用户杀死的应用程序 该应用程序不会启动到后台模式 并且application didReceiveRemoteNotification fetchCompletionHandl
  • 一旦 webapp 添加到主屏幕,是否可以强制 iphone/ipod 更新 apple-touch-icon?

    我使用 safari 的所有推荐链接和元标记创建了一个网络应用程序 例如

随机推荐