一段时间后,我发现我的应用程序性能有所下降,我想弄清楚到底是怎么回事。
我有一个复杂的 View Controller (VC1),其中包含 ScrollView 、内部的几个 TableView 、一些具有水平滚动和自定义绘图的自定义单元格等。
当我尝试调用 presentViewController 将另一个 View Controller 推到 VC1 之上时,所有这些对象(重新加载表、重新定位 subview 等)经过几次(大约 10 次)刷新后,我可以看到 viewWillDisappear 之间有大约 2 秒的延迟> 和 viewDidDissapear
我试图对应用程序进行概要分析以查看是否存在内存泄漏,但没有找到。当 View 刷新并在不同模式之间切换时,内存使用量会增加,但随后它会在 30m 左右变得或多或少稳定。
在模拟器中运行良好,但在 iPhone5 上显示速度较慢。只有当我尝试从该 View Controller 切换 时,这种缓慢才可见。
我运行了一个分析器并记录了这 2 秒的用处。这是跟踪文件的链接:https://dl.dropboxusercontent.com/u/6402890/trace.trace.zip
正如我所见,UIKit 花费的大部分时间都在进行布局。
我可以做些什么来优化它?有没有办法拍摄 View 的快照并将其用于“离开 View ”动画并在我们回来时恢复 View 层次结构?
更新:为探查器添加屏幕截图(点击查看完整分辨率):
更新 2:
分析 recursiveDescription 的输出后,我可以看到以下内容:
有什么建议吗?
最佳答案
从你的堆栈来看,我怀疑你添加了大量你不想添加的 View 。由于它与重新加载有关,我会检查您的重新加载逻辑并确保它不会在不删除以前的 View 的情况下重新添加层次结构中的所有 View 。您可以编写快速调试例程使用-recursiveDescription 递归遍历每个 View 的-subviews 并将它们打印出来以查看层次结构中的内容.
您的问题可能出在图层层次结构而不是 View 层次结构中,但您描述的症状让我想到了 View 。
编辑:从您的更新来看,您可能正在进行以下两件事之一。最有可能的是,如果这些是实际的 UITableViewCells 甚至不应该再存在,那么您在某处有一个保留循环。或者,您的 cellForRowAtIndexPath: 可能不正确,并且可能在它应该只是重新配置单元格时向现有单元格添加新 View 。
不过,无论哪种情况,对于“最佳情况”而言,200 次观看次数似乎都很多。您可能在应该进行自定义绘图的地方过度使用了 View 。如果性能没问题,那么……好吧,但我会在您支持的最慢设备上仔细测试。
关于ios - viewWillDisappear 和 viewDidDissapear 之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435633/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A