尝试测试我的基于 UI5 的应用程序。我不喜欢 OPA 的东西,所以我一直在使用 QUnit。这很好——可以正常工作。我想从头开始每个模块,这样测试就不会互相污染,并且我可以从干净的状态开始。但是,每次我创建应用程序的新实例时,都是重复 ID
错误(显然......)。 Destroy() 会删除与应用程序相关的所有 DOM 元素,但事件的 core 仍然存在,这似乎会记住以前创建的元素,因此这无法解决任何问题。
如何重新启动 UI5?我唯一的选择是将每个模块粘贴在它们自己的 HTML 页面中,这并不好。
最佳答案
当我读到你的帖子时,我想:哇,如果他是对的,我们就面临着严重的内存泄漏问题。
但后来我写了一个测试...;-)
http://jsbin.com/pocayekalu/5/edit?js,output
上面的测试只是用随机数数组创建垃圾控件,只会污染内存。五秒后它们全部被销毁并创建新的 - 最后一个计数器被渲染到 DOM。
然后我运行分析器并观察内存。它首先增长到某个点,然后再次定期释放:
发生的情况是,一旦销毁一个控件,它就会从核心的映射中删除,该核心通过 ID 存储对所有控件的引用。 这并不意味着 Javascript 对象已被销毁 - 您仍然可以保留对实际对象的引用。
一旦您删除了代码中对控制对象的所有引用,这仍然并不意味着浏览器会将它们从内存中删除,这是在下一次垃圾收集器运行期间完成的,这可能会立即启动,甚至永远不会启动 -取决于您的应用使用了多少内存以及浏览器引擎认为足够的内存。
当浏览器引擎决定清理时,这基本上是你无法控制的。在上面的测试中,浏览器被迫运行垃圾收集,因为我们强制它耗尽内存。
更新:
如果您有一个应用程序,并且所有控件都位于应用程序控件树下的某个位置(意味着:所有控件都添加到父控件的聚合中),则只需销毁该应用程序也会销毁所有子控件(及其子控件)。
关于unit-testing - 有人知道如何“完全”销毁 UI5 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31475880/