我正在iPhone上分析我的应用程序。我创建了很多UIWebView,并将它们粘贴到一个MonoTouch.Dialog表中(比方说1000)。我有一个按钮,可以清空表格部分,并处理any视图和对任何WebViews的引用。
我注意到在单声道配置文件中,UIWebview的实例减少到了零(这是理所当然的)。然而,如果我使用Instruments (分配)做同样的测试,它显示“实时”the浏览量从未减少,内存也从未恢复。我甚至试过GC.Collect,结果也没什么不同。
我还看到Mono配置文件显示,当在Instruments中显示约5meg时,正在使用的总ram约为1.5兆。
第一个项目更让我担心,因为我似乎无法恢复该内存并销毁所有这些实例。我是理解错了,还是有其他问题?谢谢。
发布于 2013-01-29 20:39:59
如果UIWebView实例的数量在Mono profiler中下降,但在Instruments中没有下降,这意味着本机代码持有对这些实例的引用,阻止它们被释放。
我建议您在Allocations工具中启用"Record reference count“选项,然后在UIWebView实例仅出现在Instruments中时调查retainCount -您需要将每个保留调用与一个release调用配对(但至少会有一个无法配对,而这正是您要寻找的)。此时,您需要弄清楚为什么保留调用没有相应的释放调用。
Mono配置文件和分配工具实际上都不会告诉您正在使用的ram总量(它们测量的是不同的东西,这就是数量不同的原因)。Mono分析器仅测量托管对象,而Allocations对象除了测量托管对象外,还测量大多数(但不是全部)本机分配。
发布于 2013-01-30 03:59:25
我想这是个误会。
UITableView的。它可以隐藏它的很多复杂性,但底层行为仍然是identical;UITableView使用UITableViewCell实例。然而,为了最大限度地减少内存需求,它尽可能地重用单元。因此,一个有1000个单元格的表格,在屏幕上只显示12个单元格,可能只需要分配(不超过)12个单元格(而不是1000个)。普通(或MT.D)代码如下所示:
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell ("cell") as MyCell;
if (cell == null) {
// create new cell
cell = new MyCell ();
} else {
// prepare cell for reuse
}
// customize cell
return cell;
}可能发生的情况是:
当你创建1000个elements;
UITableView单元格),cache);UITableView已经分配了什么(例如,14个缓存的/可重用的DialogViewController单元格将在你释放时释放,这是由DialogViewController分配的)。否则(缓存的)单元格将不在您的控制之下;https://stackoverflow.com/questions/14570776
复制相似问题