避免Titanium Mobile App发生Memory Leak的小技巧(转载)
【原文】http://erinylin.blogspot.com/2011/11/some-tips-to-avoid-leaking-memory-in.html (需要FQ)
Titanium Mobile 真的是一易的跨平台 Mobile App SDK,不由於 Javascript 的自由撰格,外加一般使用者不了解 Titanium Mobile SDK 倒底中介了什,往往到後期 App 在 runtime 常出 out of memory issue,用了各方法「抓漏」也搞不懂什 ?候你就始沮,然後心的 OS 狂叫著:「什我不乖乖的 Objective-C or Java!!!!!」
其只要持撰原,就可以漏失害降到最低。
以下是用避免漏失的技巧:
1. 使用 namespace 作避免混 global scope
//案名的 namespace var Ns = {}; //理 ui Ns.ui = {}; //理 model Ns.model = {}; //理 control Ns.control = {};2. Using factory method to create instance.
使用工方法作
Ns.ui.createMainWindow = function(){ var win = Ti.UI.createWindow({ title: 'Hello world' }); //其他要放置在 main window 的 view components 都在 //得回 return win; } var mainWin = Ns.ui.createMainWindow(); mainWin.open();3. 小心使用 Ti.App.addEventListener 等 Ti 系列的 global event listener (最手)
如下例:
Ns.ui.createTestWindow = function(){ var win = Ti.UI.createWindow({ title:'Test' }); var label = Ti.UI.createLabel({ text:'hahaha' }); win.add( label ); //如果客 event views:hoho 便 label 引入 Ti.App.addEventListener('views:hoho', function(){ //label 是 local variable 喔!!!! label.text = 'hohoho'; }); /* * 重!! global event listener 接受了 local variable , * 就得在 win.close() 的候也要一移除 event listener */ return win; }4. 的最手段!!真的找不到哪漏水的窗直接所有或指定 null
Ns.ui.createMainWindow = function(){ var win = Ti.UI.createWindow({ title: 'Hello world' }); var label = Ti.UI.createLabel({ text:'hahaha' }); win.add( label ); //自定 win close 要另外行的 function win.addEventListener('close', function(){ win.removeEventListener( 'close', arguments.callee ); win.remove( label ); label = null; //再 close 一次也不出事 win.close(); win = null; }); return win; }