HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题最初是处理从磁盘加载的字符串和我的应用程序内存不足但有一个更简单的方法使它崩溃,我不明白为什么.运行下面的代码,它将在几秒钟内死亡(iPad 4.2).
理论上它应该永远运行.没有对大型StringBuilder保留引用,它立即设置为NULl.
如果我在instruments中观看它,几次循环后内存会上升到160MB,应用程序就会死掉.为什么内存没有发布?
每个循环增加内存大约10MB ……

一个想法是GC无法跟上,但Thread.Sleep()的延迟有多大并不重要 – 最终,内存将消失.

测试看起来可能是学术性的,但我遇到了一个崩溃的真实应用程序的问题.它有一个方法从Webservice请求中获取(巨大的)字符串,将该字符串转换为XmlDocument并解析它(将某些内容存储到DB).然后该方法退出但内存保持高位.如果我再次执行相同的方法(一小时后左右!),应用程序将死OOm.为什么仍然分配内存?

@H_607_14@public override bool FinishedLaunching ( UIApplication app,NSDictionary options ) { Thread oThread = new Thread ( DoIt ); oThread.Start ( ); return true; } public void DoIt () { using(var o = new NSAutoreleasePool()) { while(true) { StringBuilder oSB = new StringBuilder(); for(int i = 0; i < 800000; ++i) { oSB.Append("1234567890"); } oSB = null; Thread.Sleep(1000); } } }

编辑:我注意到如果我改变Do()方法如下所示,内存保持稳定.它上升了一段时间,然后GC开始并清理它.如果我在创建NSString对象后添加s.Dispose(),内存根本就不会上升.
所以它似乎是.NET字符串类的问题.

@H_607_14@public void DoIt () { using(var o = new NSAutoreleasePool()) { StringBuilder oSB = new StringBuilder(); for(int i = 0; i < 800000; ++i) { oSB.Append("1234567890"); } while(true) { NSString s = new NSString(oSB.ToString()); Thread.Sleep(1000); } } }

解决方法

StringBuilder在每次迭代时在内部分配新的更大的数组(它的大小可能会加倍).最终,您将最终得到一个碎片堆.

大佬总结

以上是大佬教程为你收集整理的xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?全部内容,希望文章能够帮你解决xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。