【转】避免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;
    }

你可能感兴趣的:(mobile,Titanium,leak,appcelerator)