This was a problem with AngularJS.  They will be pushing out a fix.

On Tuesday, February 24, 2015 at 9:31:11 AM UTC-5, Mo Moadeli wrote:
>
> (simple plunkr demo here <http://plnkr.co/edit/1Adh2P65ZS8YHYJZhLMk>)
> *SUMMARY:*
>
> There is a leak using ng-repeat *after the 2nd wave* iterating over an 
> array of custom objects like this :
>
>     <div ng-repeat="d_sampleObject in mySampleObjects">
>         {{d_sampleObject.description}}
>     </div>
>
> Memory profile reveals an extra 'd-sampleObject' left over and not 
> de-referenced. More details (via a controller and an injected service) 
> below. A simple demonstration also in the provided plunkr link. Any 
> thoughts and help greatly appreciated in advance!
>
> *NOTE:* 'mySampleObjects' is an array of the following instances:
>
>         ml.MySampleObject = function (id) {
>
>             this.id = id;
>             this.description = 'this is object #:' + ' '+id;
>         }
>
> *DETAILS:*
>
> I have a custom object model that reflects the business domain objects 
> that we utilize in our AngularJS app. I have found that when I pass an 
> instance of one of my custom objects to ng-repeat, a reference is kept to 
> it (I think by Angular) and memory is not freed. This happens on the second 
> 'wave' (click on 'refresh') of the ng-repeat as it iterates, again, over 
> its array of objects. This leak is exposed in my Profile tests (in Chrome) 
> . Here <http://plnkr.co/edit/1Adh2P65ZS8YHYJZhLMk> is a short example in 
> plunkr. Click on 'refresh' button once (or more) to see the extra 
> 'd_sampleObject' object instance that is leaked (in Chrome Profile 
> Inpsection). Note, the 'd_sampleObject' name is only used when passed to 
> ng-repeat. I have included screenshots of the extra object instance 
> ('d_sampleObject') that is being leaked further below. Why is there a leak 
> and how can it be avoided?
>
> (Note, I have found if I don't iterate over my object collection (JS 
> array) thru an object but rather thru an primitive index ('integer'), there 
> is no leak. The leak seems to only happen when I use an object reference as 
> a result of ng-repeat iterations)
> *SIMPLE HTML:*
>
> <!DOCTYPE html><html ng-app="memoryleak">
>
>     <head>
>     <meta charset="utf-8" />
>     <title>Memory Leak Test</title>
>     <script>document.write('<base href="' + document.location + '" 
> />');</script>
>     <script data-require="[email protected]" 
> src="https://code.angularjs.org/1.3.13/angular.min.js"; 
> data-semver="1.3.13"></script>
>
>     <script src="app.js"></script>
>     <script src="dataservice.js"></script>    
>   </head>
>
>   <body ng-controller="MainCtrl">
>
>
>     <div ng-repeat="d_sampleObject in mySampleObjects">
>         {{d_sampleObject.description}}
>     </div>
>
>     <br>
>
>     <button ng-click="redo()">Number of refreshes: {{numRedos}}!</button>
>   </body>
> </html>
>
> *SIMPLE APP.JS*
>
> (function(ml) {
>     var app = angular.module('memoryleak',['servicemodule']);
>
>     app.controller('MainCtrl', ['$scope', 'dataservice', function($scope, 
> dataservice) {
>
>         $scope.redo = function () {
>
>             $scope.numRedos++;
>
>             $scope.mySampleObjects = dataservice.myObjectCollection;
>
>             dataservice.redo();
>         }
>
>         $scope.redo();
>
>     }]);
> }(window.MEMLEAK = window.MEMLEAK || {}));
>
> *SIMPLE dataservice.js*
>
> (function(ml) {
>
>     'use strict';
>
>     var serviceModule = angular.module('servicemodule',[]);
>
>     serviceModule.factory('dataservice', ['$rootScope', '$http',
>                                         function ($rootScope, $http) {
>
>         this.myObjectCollection = [];
>
>         var that = this;
>
>         this.redo = function () {
>
>                 that.numRedos++;
>
>             // that.myObjectCollection = [];
>             that.myObjectCollection.length = 0;
>
>             for (var i = 0; i < 10; i++) { 
>                 var sampleObject = new ml.MySampleObject(i);
>
>                 that.myObjectCollection.push(sampleObject);
>             }   
>
>
>             sampleObject=null;        
>
>         }
>
>         ml.MySampleObject = function (id) {
>
>             this.id = id;
>             this.description = 'this is object #:' + ' '+id;
>         }  
>
>         return this;   //return the entire service to make methods accessible 
> to dependents
>
>     }]);
> }(window.MEMLEAK = window.MEMLEAK || {}));
>
> SCREENSHOT 1: (FIRST PAGE LOAD--there are 10 'mySampleObjects' created) 
> [image: 
> SCREENSHOT 1: (FIRST PAGE LOAD--there are 10 'mySampleObjects' created)] 
> SCREENSHOT 
> 2: (CLICKED ON REFRESH--there is an 11th mySampleObject created/leaked with 
> a reference to the instance name of 'd_sampleObject' passed to ng-repeat.) 
> [image: 
> (CLICKED ON REFRESH--there is an 11th mySampleObject created/leaked with a 
> reference to the instance name of 'd_sampleObject' passed to ng-repeat.)]
>

-- 
You received this message because you are subscribed to the Google Groups 
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to