我正在编写一个应用程序(在 iOS 5 中使用 ARC!),它在自定义 UIViewController 中显示数百个对象我写过用户可以滚动并选择,每个对象都是显示为用户可以触摸的缩略图。
这些对象中的每一个都与一个特殊的 UIViewController 子类相关联,该子类处理与该对象相关联的信息的自定义表示。例如,它可能是可以缩放和平移的图像,或者只是一些需要格式化的文本。
现在,我的每个图像对象都有一个与之关联的大图像。使用 Instruments 应用程序分析我的代码并运行 Activity Monitor,我发现当加载自定义 UIViewController 子类并显示图像时,它们每个大约占用 5-10MB。这对于一些图像来说没问题,但最终我的应用程序占用了太多内存并崩溃了。
我已经在我的子类的 -viewDidUnload 方法中编写了显然所有必要的东西来告诉 ARC 释放这个内存,但是在发出警告之前没有内存被释放,这通常发生在应用程序即将崩溃。有几次,我注意到如果我足够接近阈值但没有超过它,我之前查看过的 UIViewController 子类最终会从内存中清除,尽管-viewDidUnload 方法显然没有被调用(相反,-didReceiveMemoryWarning 消息被发送到我的自定义 UIViewControllers)。但是,大多数情况下,我的应用程序会因内存不足而崩溃。
所以我的核心问题是,我应该假设一个对象会被 ARC 尽快处理掉,还是它总是等到空间变紧?我想要的行为是让自定义 View Controller 及其数据立即刷新,这样内存永远不会成为问题。
我不相信对象对我的自定义 View Controller 有任何强引用,我使用以下代码在我的主视图 Controller 中实例化它们:
[self presentViewController:[cObj grabModalViewController]
animated:YES completion:nil];
其中 cObj 是带有对象信息的自定义类。 grabModalViewController 简单地实例化一个正确类型的对象并返回指针,因此大概该方法完成后该对象的本地引用应该被丢弃。
因此,我预计,当我稍后打电话时
[self dismissModalViewControllerAnimated:YES];
仅通过 presentedViewController 指向主视图 Controller 的自定义 View Controller 应该从内存中清除,但这并没有发生。
这可能是因为我的自定义 View Controller 对象中有强引用吗?
本质上,我想要完成的是通过更好地预先管理事物来尽可能避免出现更多的内存警告,但也许这不是正确的态度。
如果有任何建议,我将不胜感激,我很乐意发布任何有用的代码。
最佳答案
So my core question is, should I assume that an object will be disposed of by ARC as soon as possible, or does it always wait until space becomes tight?
ARC 是一种编译时技术。它对您的运行时内存堆一无所知。因此,它不能等到空间变紧才释放元素。对您的问题的具体回答是,ARC 将在您不再需要时立即发布任何内容。
关于objective-c - iOS - ModalViewControllers 的 ARC/内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790705/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s