我们正在实施似乎有重大的内存泄漏的应用程序。 举一个例子,我们有与在单探查注册的38倍corrosponding视图模型视图,但它应该是垃圾收集。 我们有很多的自定义控件等,但应该在哪里,这些被布置 - 所以我们应该在哪里做我们的清理工作于iOS 6 viewdidunload不叫了?
问候
我们正在实施似乎有重大的内存泄漏的应用程序。 举一个例子,我们有与在单探查注册的38倍corrosponding视图模型视图,但它应该是垃圾收集。 我们有很多的自定义控件等,但应该在哪里,这些被布置 - 所以我们应该在哪里做我们的清理工作于iOS 6 viewdidunload不叫了?
问候
这是一个大问题......,不能轻易回答的一般情况。
在一般情况下,如果你写得真好简单的ViewModels和漂亮的简单的浏览,那么你不会得到任何内存泄漏。
但是,如果你有意见引用的ViewModels,这反过来又莫名其妙地引用次数回调,那么它很可能得到内存泄漏 - 特别是如果您的视图模型订阅上的服务活动。
一个特别糟的情况是,当ObjC和C#都具有对对象的引用。 有一个关于这方面的一些讨论http://forums.xamarin.com/discussion/97/correct-way-to-pop-a-dialogviewcontroller-mine-are-staying-in-memory其中还引用了我们曾经在一个问题在SQL位的例子- https://github.com/slodge/MvvmCross/issues/19
这可能不是你的漏电流的情况下,但它是值得一读Rolf的答案- http://forums.xamarin.com/discussion/comment/535/#Comment_535 -几次-它不是一个入门级的解释,但它是有道理的最终!
因此,为了解决当前的问题...
制定出什么是泄漏
明白为什么 - 它是什么,是抱着到引用。
修理它。
关键是在对错误的修正潜水前投入的精力体面的数额做的1和2的研究,为3.在试图“修复”没有真正知道什么“它”是没有意义的。
好消息是,单探查 - 用其内置的工具,以确定哪些有什么参考 - 是这份工作帮助非常好。
从你的描述,我知道你已经发现这个工具-但对于其他人阅读,请参阅- http://docs.xamarin.com/ios/Guides/Deployment%252c_Testing%252c_and_Metrics/Monotouch_Profiler
一旦你已经确定什么是泄漏,为什么,然后步骤3将需要一些思考,但有望容易回答。
有时候,解决的办法是:
WeakReference
类,以避免泄漏。 无论发生什么情况,不要慌张,做好从工程学的角度解决这个。 这些泄漏非MvvmCross和非MonoTouch的代码发生太大 - 使用MvvmCross用干净的IoC的架构应该让他们更容易找到并删除。
如果问题变成是在某处MvvmCross结合,那么,请不要登录它作为一个错误 - 我把这些问题非常重视!
还有在上MvvmCross回购关于我们是否应该使用我们所有的绑定代码在WeakReferences进行了长时间讨论一个开放的错误-见https://github.com/slodge/MvvmCross/issues/17 -我认为这样做这一点 - 它会帮助人们避免一些错误......但不是全部。 这个问题仍然是开放的。
更新 :我没有回答
我们有很多的自定义控件等,但应该在哪里,这些被布置
该框架应处置这些你。
如果没有的话那可能是因为别的事情被泄露,并持有到您的视图,然后抱着你的控制。 你需要解决这个潜在的问题,而不是在控制过早地调用Dispose()。 内存泄漏调试是不容易的,但是是一种乐趣(有时)
一个很好的规则是,被添加到基于NSObject的类containees应该只参考使用WeakReference的对象的容器。
像这样:
// MyView is a UIView, which is an NSObject, so the rule will apply here
class MyView : UIView {
WeakReference<UIViewController> myController;
public MyView (RectangleF bounds, UIViewController myContainer)
: base (bounds) {
this.myController = myContainer;
}
}