序言: 我正在谈论的视图控制器视图在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属性,则内存几乎不会上升并正确释放。
答案 0 :(得分:1)
我根据你的代码编写了一个样本,虽然在分配时内存使用率确实上升,但没有泄漏(我打开和关闭图像100次,内存没有改变)。
它上升的原因是BackgroundImage属性由Objective-C中的副本@property支持,这意味着整个对象在赋值时被复制,所以如果你有一个巨大的模式图像,然后分配它,你将在短暂的一段时间内在内存中有2份图像副本。
您看到内存增加的原因正如我在IRC上向您解释的那样,MonoTouch在v3中没有压缩GC。