2013-03-09 156 views

回答

7

Angular主要爲你處理它,但有些地方你需要考慮內存。由於您的服務從創建到應用程序關閉時都存在,因此很容易在這些對象中佔用內存。就像如果你的實現緩存一樣,你可能最終將緩存的引用保存到永遠不會再使用的對象中,所以你需要一個策略來釋放這些對象。

另一個地方是在您與DOM進行交互的指令中。但只要你聽取$scope.$on('$destroy', function() { /* Clean up code here */ });並自己清理,你應該沒問題。

+0

因爲Angular最適合你,你建議你用什麼方法清理自己(在這裏說「清理代碼」)? – 2013-10-04 20:39:17

+0

大多數情況下,當您使用Angular以外的庫時。就像如果你已經創建了一個指令來使另一個庫像日期選擇器一樣angularify,你會想要聽$ destroy來釋放和清理日期選擇器。 – 2013-10-06 18:45:18

+0

好吧,有道理,謝謝澄清! – 2013-10-07 19:12:59

4

如果使用$ timeout來執行不返回null的函數,則會發生內存泄漏。這是非常容易意外地做咖啡腳本,因爲它隱式返回函數的最後一行的值例如。

doSomethingEveryTenSeconds = -> 
    //do something here 
    $timeout(doSomethingEveryTenSeconds, 10000) 
    null #prevent memory leak 
+2

我沒有得到這個。你的例子,最後沒有'null' ...如果我像這樣調用它,'doSomethingEveryTenSeconds()',但是不向任何東西分配返回值(不執行'a = doSomethingEveryTenSeconds()'),即使它返回最後一行值,它是如何泄漏的? – 2013-11-13 09:28:14

1

要回答這個問題,你真的需要知道Angular的垃圾收集。它做得很好。但是如果它認爲仍然存在對某個對象的引用,或者如果其他引用了該對象,則會出現內存泄漏。您可以使用jQuery或任何其他庫通過DOM對象創建循環引用。

下面是一個例子。 http://plnkr.co/edit/nIt78S?p=preview

如果打開controllers.js你會看到一個jQuery $()到角$scope循環引用:

//*** CREATING MEMORY LEAK *** 
$("#memory-leak").on('click', function() { 
    console.log("[HomeController " + myInstance + "] click()"); 
    $scope.data.counter++; 
}); 

因爲jQuery的。對()方法連接到一個div控制器之外,它的從來沒有釋放。您可以通過以下方式進行測試:
1)打開控制檯
2)在主頁和數據頁面之間來回導航。每次你做,注意一個新的主控制器實例被創建。
3)創建3個或4個實例後,單擊顯示「內存泄漏測試」的div。你會從上面的代碼中看到3或4個控制檯日誌,一個內存泄漏!