jjzjj

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

coder 2023-09-22 原文

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

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

  2. 将所有属性设置为nil

  3. 使用 CGContextRelease 释放任何上下文,使用 CGImageRelease 释放 CGImage,使用 CGColorSpaceRelease 释放颜色空间(释放任何非对象)

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

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

最佳答案

很多人误解了viewDidUnload的意义。特别是,它不是 viewDidLoad 的对应物。在大多数情况下,您的 View Controller 将在没有调用 viewDidUnload 的情况下被释放。 出于这个原因,您应该绝不viewDidUnload 中的释放视为 viewDidLoad 中分配的适当平衡。

viewDidUnload 已被 Apple 弃用。可能反对使用它的最佳理由是它的 header (我已经包装好了):

- (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 是什么?它背后的想法是 View 正在从 View Controller 后面卸载。这使您有机会分离任何指向它的指针并清除任何您可以轻松重建的信息。您的 View 将可能 重新加载,此时您需要重建所有缓存。 Apple 对此进行了描述:

When a low-memory condition occurs and the current view controller’s views are not needed, the system may opt to remove those views from memory. This method is called after the view controller’s view has been released and is your chance to perform any final cleanup. If your view controller stores separate references to the view or its subviews, you should use this method to release those references. You can also use this method to remove references to any objects that you created to support the view but that are no longer needed now that the view is gone. You should not use this method to release user data or any other information that cannot be easily recreated.

请记住,现在不需要将对 viewDidUnload 中对象的引用清零。如果您按照 Apple 的建议使用 ARC,则您的 View socket 会将弱引用置零。无需您编写 viewDidUnload,它们将自动被清零!

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

You can override this method to release any additional memory used by your view controller. If you do, your implementation of this method must call the super implementation at some point to allow the view controller to release its view. If your view controller holds references to views in the view hierarchy, you should release those references in the viewDidUnload method instead.

通常,人们放在viewDidUnload 中的东西在viewDidDisappeardealloc 中处理得更好。留给viewDidUnload 的唯一事情就是清空任何您的 缓存,当 View Controller 仍然打开时,在 View 已打开后的某个时刻需要时,这些缓存可以在不丢失数据的情况下重建已重新加载。 (同样,这应该在 didReceiveMemoryWarning 中处理。)这些缓存应该延迟构建;当您的应用再次需要它们时,它会安静地重建它们。

那么在viewDidUnload中应该做什么呢?如果您使用的是 ARC:没有。甚至不写它。 事实上,在撰写此答案后,Apple 已弃用 viewDidUnload

对于 CGContextReleaseCGContext 资源不是 Objective-C 对象。 (你指出了这一点,但我想为后代重复一遍。)因此,它不能被 ARC 自动释放。您有责任确保它像旧的手动保留释放 (MRR) 内存管理方案一样被释放和清零。

如果您将此代码放在 viewDidUnload 中,则无法保证它会被调用。它必须进入 dealloc。您也可以将它放在 viewDidUnload 中,但是……

所以:

  1. 没有必要或没有帮助。与 View 层次结构相比,您的实例变量是微不足道的。
  2. 没有必要或没有帮助。与 View 层次结构相比,您的属性是微不足道的(只要您的属性不是对 View 层次结构的强引用)。
  3. 这会导致内存泄漏,因为 dealloc 通常会在没有 viewDidUnload 的情况下被调用。
  4. 没有必要或没有帮助。参见第 1 点和第 2 点。

关于iphone - 在 iOS 中,使用 ARC,是否足以将所有 ivars 和属性设置为 nil,并在 viewDidUnload 中释放上下文、图像、颜色空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936569/

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

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. ruby 诅咒颜色 - 2

    如何使用Ruby的默认Curses库获取颜色?所以像这样:puts"\e[0m\e[30;47mtest\e[0m"效果很好。在浅灰色背景上呈现漂亮的黑色。但是这个:#!/usr/bin/envrubyrequire'curses'Curses.noecho#donotshowtypedkeysCurses.init_screenCurses.stdscr.keypad(true)#enablearrowkeys(forpageup/down)Curses.stdscr.nodelay=1Curses.clearCurses.setpos(0,0)Curses.addstr"Hello

  10. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

随机推荐