Ionic& amp;中的奇数内存泄漏适用于iOS的Cordova

时间:2015-02-10 05:29:22

标签: ios angularjs cordova memory-leaks ionic-framework

我的离子和cordova应用程序中有一个奇怪的内存泄漏。泄漏不存在铬,但当我运行应用程序,它肯定存在。基本上,我需要遍历大量数据并将其设置在$scope上。

现实生活中的数据是从服务器收集的,但在这里我只是用一个函数模拟它。此外,在真实的应用程序中,按下按钮调用$scope.vote,而不是按下按钮来调用for循环。

那说这是一个很好的模拟。数据较小,但我使循环运行更多,所以你可以实际看到泄漏。当我使用从服务器收集的大型数据集时,泄漏更为重要。

我目前正在运行v1.0.0-beta.13(测试版14对我造成了很多其他问题...)该软件包包含角度1.2.25。

我已将其归结为以下测试用例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title></title>


    <!-- compiled css output -->
    <link href="css/ionic.app.css" rel="stylesheet">

    <!-- ionic/angularjs js -->
    <script src="lib/ionic/js/ionic.bundle.js"></script>

    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>

    <script>
        angular.module('starter', ['ionic'])
        .controller("testCtrl", function($scope){
            $scope.b = [];
            $scope.count = 0;
            function getBallots() {
                $scope.b.push({
                    _id: "54d7d680bdd622982e91a45f"
                });

                $scope.b.push({
                    _id: "54d7ef2ac659dd302a128924"
                });

                $scope.b.push({
                    _id: "54d7ef2ac659dd302a128929"
                });
            }

            getBallots();

            $scope.vote = function(){
                if($scope.b.length){
                    $scope.ballot = $scope.b.shift();
                    $scope.count ++;
                }
                if($scope.b.length<=0){
                    getBallots()
                }

            };

            $scope.start = function(){
                for(var i = 0; i < 10000; i++){
                    $scope.vote()
                }
            }

        })
    </script>

</head>
<body ng-app="starter" ng-controller="testCtrl">


{{ballot._id}}<br>
{{count}}
<br><br><br>
<button class="button button-large button-royal" ng-click="start()">BUTTON</button>

</body>
</html>

仪器工具显示在我的iphone 5S上分析应用程序时显示此信息。我知道在这个测试案例中,泄漏的大小非常小,但在我的真实应用程序中,数据要大得多,因此这成为一个大问题。每个凸起都是按钮连续点击5次的结果。

enter image description here

仪器跟踪文件可以在http://s000.tinyupload.com/?file_id=52410311803253693651

下载

2 个答案:

答案 0 :(得分:4)

我不会选择这个&#34;答案&#34;因为它没有解决问题,但我将分享我所做的工作,以减少我的应用程序的内存问题,以防它对其他人有帮助。基本上我做到了这一点:

  1. 升级至离子β14,角度为1.3.6
  2. 重写逻辑以删除任何&#34; ng-ifs&#34;那些被反复创造/破坏的东西。我用ng-shows或与css相关的东西取而代之。
  3. 这大大减少了内存泄漏,但没有完全消除内存泄漏。

答案 1 :(得分:0)

我也遇到了类似的问题,我花了几个小时优化代码来修复它:

  • ng-options 中切换到轨道,即“activity.name for activity in activity track by activity.id”(&lt; - 这产生了最大的影响) )
  • 删除尽可能多的 ng-show / ng-if
  • 删除了所有$ rootScope变量(首先应该没有(m)任何变量)
  • 删除了所有'监视'任务并将其替换为事件 - 我销毁了( $ destroy )只需要一次
  • 减少了 $ scope 变量的数量......实际上我将/应该在下一步中使用controllerAs-Syntaxt(http://toddmotto.com/digging-into-angulars-controller-as-syntax/