4
  • 應用類型:移動
  • 鈦SDK:3.1.1.GA
  • 平臺&版本:iOS的6.1
  • 設備:iPhone模擬器
  • 主機操作系統:OSX 10.8.4
  • 鈦工作室:3.1.1.201306112235

parent_controller.js:鈦應用程序事件控制器之後發射被破壞

_.each(category, function(inventory_item, index, list) { 

    var row = Alloy.createController('inventory_list_row', { 
     selectedBackgroundColor: '', 
     data: inventory_item 
    }); 

    row.destroy(); 
    row = null; 

}); 

Ti.App.fireEvent('checkIn'); 

inventory_list_row.js:

Ti.App.addEventListener('checkIn', function(e) { 
    console.info('Checking In: ' + args.data.title); 
}); 

前言:上述代碼被沖淡證明點。我知道它並沒有真正做任何事情,但確實存在問題。

parent_controller.js中的代碼可以根據我的Titanium Mobile iPad應用程序中的用戶交互執行多次。如果上面的代碼只在一切正常時運行。每次上面的代碼再次運行時,以前的控制器都是如何保留在內存中,並且仍然是陷阱事件。

例如,假設第一次執行代碼時生成了3個inventory_list_row控制器。在控制檯中,我會看到3'正在檢查'消息按預期顯示。但是,第二次運行時,我會看到控制檯中出現6'Checking In'消息,等等。

這是爲什麼,我能做些什麼來防止這種情況?你可以看到我已經嘗試使用.destroy並將行設置爲null無濟於事。

回答

1
  • 您可能需要刪除 控制器的銷燬方法中的eventListener。
  • 你爲什麼使用全局事件監聽器來進行本地事件管理?
  • 也許你可以使用一個回調,而不是

這些都只是一些簡單的看法沒有我寫任何代碼veryify。老實說,我根本不使用全局事件。

0

繼承人快速修復,實施Aaron在他的第一個項目符號中所說的,只需將此方法添加到您的庫存行控制器。

// Here is the event listener function 
var checkInListenFunction = function(e) { 
    console.info('Checking In: ' + args.data.title); 
} 

// Add just like in your code 
Ti.App.addEventListener('checkIn', checkInListenFunction); 

// When this controller is destroyed you have to remove the listener as well 
// OR the controller will forever stay in memory, since you access variables 
// from the controllers scope! 
exports.destroy = function() { 
    // Remove the listener first 
    Ti.App.addRemoveListener('checkIn', checkInListenFunction); 
    $.destroy(); 
} 

全球事件偵聽器保持不變,直到您刪除它們,這意味着(根據JavaScript的作用域規則)他們訪問任何變量自動持久爲好。由於您在事件偵聽器中訪問了args.data.title,並且該變量的作用域爲inventory_list_row控制器,所以無論您做什麼,解釋器都會將控制器(或大部分控制器)存儲在內存中,因此這些事件在您銷燬後會持續很長時間並將它們排除在外。

我根本不會使用全局事件偵聽器,在內存稀缺的環境中存在太多的範圍混淆和內存泄漏的可能性。以亞倫的建議並基於此回調,或者在控制器本身上觸發本地事件。

編輯:

,如果你只想要那個聽衆「聽」一週時間,只是立即刪除它你可以這樣做,很簡單:

Ti.App.addEventListener('checkIn', function(e) { 
    console.info('Checking In: ' + args.data.title); 
    Ti.App.removeEventListener(this); 
}); 
+0

正如我在下面所提到的,「刪除在destroy方法中的eventListener「將完成你在這裏完成的操作,除了它將使用Alloy控制器默認提供的銷燬方法 –

+0

@AaronSaunders更新了我的答案...我對於如何覆蓋'destroy 「但是,會感激雙重檢查 –

相關問題