草庐IT

ios - 当 View Controller 被关闭时,它应该清空内存吗?

coder 2023-09-24 原文

我想了解 Objective-C 中的内存管理,我发现这并不容易,因为我在 Objective-C 和 ARC 方面还很陌生,而且我主要习惯于编写我没有的脚本语言处理那么多(或根本不处理)内存管理。

我正在开发的应用程序在按下按钮后从代码中呈现一个 viewController(附加了 xib 文件)。在这个 View Controller 中,我实例化了几个 View ;我记录了一系列图像(来自相机的照片,保存到磁盘),我将其转换为电影,并且我有一个 gps 跟踪器(mapKit),它在屏幕上显示了一个小 map 。完成所有操作后,我可以按下调用 [self dismissViewControllerAnimated:YES completion:nil];

的“完成”按钮

viewController 动画回到我的 rootViewController,因为我在 viewController 的 dealloc 方法中放置了一条 NSLog 消息,我可以确认这个 viewController 正在被关闭释放。

问题是我看到在使用应用程序(使用包括在 MapKit map 上拍照和记录 gps 位置以及生成电影文件)后内存增加到大约 80 MB,然后下降到大约 70MB当我按下“完成”时,viewController 关闭并且应用程序返回到我的 rootViewController。我可以再次呈现相同的 viewController,使用它并关闭它,应用程序仍会占用大约 70MB 的内存,这不会下降。在我看来,这并不是真正的内存泄漏,因为在那种情况下,我希望每次实例化和关闭 viewController 时内存都会稳定增加。即使我的 rootViewController 中有不同的按钮,它们都实例化了我的 viewController 类的一个新的和唯一的实例,情况也并非如此。

我想知道:是否有我应该寻找的东西或者这是预期的行为?也许该应用程序正在缓存类以供将来使用?正确执行内存管理后,我是否应该期望应用程序在关闭唯一显示的 viewController 后恢复到“原始”内存状态(在本例中约为 4 MB)?

最佳答案

如果您在 Xcode 中看到这种内存增加,而不是在使用仪器时,那么 the answer I have come up with is in this answer.

您可以阅读整个答案,它非常有深度。但长话短说,在 Xcode 中,您会看到操作系统“分配”给您的应用程序使用的内存量。每当您的应用尝试分配某些东西时,这都会增加。它不会减少得那么快,因为操作系统会进行性能猜测,认为您的应用程序将来可能需要更多内存。操作系统将内存“给定”给您的应用程序比将其拿走并稍后归还更快。

关于ios - 当 View Controller 被关闭时,它应该清空内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246307/

有关ios - 当 View Controller 被关闭时,它应该清空内存吗?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. 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返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

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

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

  6. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  10. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

随机推荐