
作为一个简单的测试,我们使用“单一视图”模板创建了一个新的iPad Monotouch项目,并使用iPad本身的仪器(iPad第三代,没有其他应用程序运行/内存)执行它.
在乐器中,如果我们经常一直按下“标记记忆”按钮,它会不断地记忆.不多,但每隔一段时间:
该应用程序在我们自己什么都不做,但显然正在执行分配内存的东西.
这是iOS问题,Monotouch问题还是其他问题?
计划创建一个24/7的iPad应用程序是否真实?我们担心,当我们开始添加代码时,内存泄漏量也会升级.该应用程序可以清楚地运行相当一段时间与上图中的泄漏,但如果它上升,内存已满的截止日期将更快.
解决方法 屏幕截图显示了分配 – 而不是内存泄漏.您可以要求仪器跟踪泄漏,即没有找到分配的内存的参考.但是,没有更多数据,如果这些是正常的话,是不可能的.我们至少需要知道分配来自哪里?仪器可以告诉您每个分配的更多细节.尝试向下钻取每个快照下的树,以查看分配的来源.
类似的情况通常是由于缓存 – 这是在每个级别完成的.在应用程序代码之外,您会注意到iOS及其框架正在进行缓存(例如图像,webkit ……).
Mono本身可以进行缓存,还可以使用在需要时增长的内存池.将显示一个分配(即使释放),但它不是泄漏 – 当释放时,如果可能(例如大小)重新使用,则重用内存.
当然它也可能是一个BUG(在应用程序中,任何框架,单声道触摸,iOS).给定时间单个小泄漏足以使应用程序崩溃,如果它发生在错误的位置(例如运行循环的一部分,处理通知……).只找到分配的来源以及它们是否是重复分配(来自同一来源)将告诉您这些分配的重要性.
编辑(更多)
所以我昨晚做了自己的应用实验.下面的屏幕截图显示了13小时45分钟的堆增长.
在前4个小时(1-13),应用程序处于前台.最后一部分(14)应用程序在后台(屏幕关闭了一夜).录音也在#14之后停止,因此这个数字随着时间的推移没有机会下降.
我的应用程序更大(初始基线为5MB),我在启动后没有使用它.一旦我知道初始化完成(它正在加载一个quite large,80MB的数据库),我的第一个“Mark Heap”就完成了. OTOH也是listen to network events,使用NSNetServicebrowser,回调到托管代码(没有任何视觉线索).
扩展快照#1显示一个对象,48个字节,堆栈跟踪以_ZL13_cache_mallocm,cache_fill,lookupMethod,_class_lookupMethodAndLoadCache3结尾……我的应用程序或单声道显示在呼叫者中没有任何内容.
扩展快照#2显示了四个对象,前两个对象在其堆栈跟踪中具有CA :: Render :: Encoder :: ObjectCacche :: invalIDate(…)和CGNotificationCenterPostNotification.第三个是_cache_addForwardEntry,第四个看起来像Heapshot#1,但是和第三个一样,它来自_XReceivedStatusbarDataAndAction(不是由我的app或monotouch直接完成的).
扩展快照#3显示了10个对象……有点长,无法列出它们,但它们都在同一个_XReceivedStatusbarDataAndAction调用下.
扩展快照#4时的模式相同.
快照#5有一个区别(11个中),其中分配来自调度队列(_xpc_connection_init),但没有可见的托管(app)或单个[触摸]堆栈帧.
扩展快照#6,#7,#8时的相同模式(如#3).
快照#9为空(无分配).
快照#10,#11喜欢#3.
快照#12也是空的.
快照#13主要类似于#3,但它也缓存相同的图像,CA :: Render :: Image :: caches_enCoding()和另一个_cache_fill lookUpMethod在收到_significantTimeChange通知时发生(未管理或UIApplicationMain下面的MT堆栈帧).其他一些分配与通知有关.
快照#14主要是关于通知(可能被告知它将进入后台).还有一些_cache_fill分配.
Is this an iOS problem,a Monotouch problem,or something else?
上面没有任何指向Monotouch甚至我的应用程序. OTOH我没有将它与ObjC应用程序进行比较(并且可能没有时间这样做)但我相信你会看到一些非常接近的东西 – 取决于所使用的API /服务(并且做同样事情的app应该显示相同的东西)分配).
就像我在YMMV之前所说的那样,泄漏(或意外的内存保留)通常是API特定的.如果您在仪器会话中发现奇怪的堆栈跟踪,请填写错误报告(Xamarin或Apple,具体取决于堆栈跟踪),以便对它们进行分析和修复(如果有错误).
Is the plan to create a 24/7 iPad app reaListic?
至于24/7运行应用程序,我认为可以做到 – 但它需要用户的合作(这可能是不现实的).切换到另一个应用程序(主页按钮,手势)意味着您的应用程序将不在前台,Apple可以杀死任何后台应用程序以回收内存.例如. App X内存耗尽,iOS开始询问,然后查杀后台应用程序以满足前台应用程序.
总结以上是内存溢出为你收集整理的iOS或MonoTouch中固有的内存泄漏?全部内容,希望文章能够帮你解决iOS或MonoTouch中固有的内存泄漏?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)