如果使用图像,UIView.BackgroundColor泄漏内存?

时间:2011-02-12 21:26:37

标签: xamarin.ios

序言: 我正在谈论的视图控制器视图在UISplitViewController中用作详细信息视图。如果用户使用拆分视图的UINavigationController进行导航,则会替换它。点击“返回”时,会创建一个有问题的视图控制器的新实例,并将其分配给拆分视图控制器控制器数组。 每次我的视图出现时,我都会看到在仪器中分配了8MB的块。导航回来一段时间最终会使应用程序崩溃。

详细说明:

在我的班级重写UIViewController我有一个:

private UIColor oBgColor = null;
ViewDidLoad()中的

    this.oBgColor = UIColor.FromPatternImage ( UIImage.FromFile ( "Data/Images/background.jpg" ) );
// This line here causes memory to go up by 8MB!
    this.View.BackgroundColor = this.oBgColor;
ViewDidDisappear()中的

// These lines should sucessfully get rid of the allocated 8MB chunk.    
this.View.BackgroundColor = UIColor.Clear;
    this.oBgColor.Dispose();
    this.View.Dispose();

代码按预期到达ViewDidDisappear(),视图消失了。

如果我将this.oBgColor分配给视图的BackgroundColor,则仅分配8MB块。保留该行并且所有工作(但我没有背景)。 每次显示视图时,我都会看到另外8MB的浪费。

这里发生了什么?是否已知BackgroundImage正在泄漏?

有趣的旁注:如果我将UIImageView添加为子视图并使用其图像而不是分配给视图BackgroundColor属性,则内存几乎不会上升并正确释放。

1 个答案:

答案 0 :(得分:1)

我根据你的代码编写了一个样本,虽然在分配时内存使用率确实上升,但没有泄漏(我打开和关闭图像100次,内存没有改变)。

它上升的原因是BackgroundImage属性由Objective-C中的副本@property支持,这意味着整个对象在赋值时被复制,所以如果你有一个巨大的模式图像,然后分配它,你将在短暂的一段时间内在内存中有2份图像副本。

您看到内存增加的原因正如我在IRC上向您解释的那样,MonoTouch在v3中没有压缩GC。