Memory Appcelerator内存泄漏-合金框架

Memory Appcelerator内存泄漏-合金框架,memory,titanium,appcelerator,memory-leaks,titanium-alloy,Memory,Titanium,Appcelerator,Memory Leaks,Titanium Alloy,我在Appcelerator中使用Alloy框架,在使用Apple Instruments测试我的应用程序时,一直在努力解决内存泄漏问题 我有一个可滚动视图,视图是该可滚动视图的视图或“页面”,视图如缩略图是“页面”视图的子视图。所有这些视图都是动态创建的,然后在用户执行重新加载可滚动视图内容的搜索时删除并重新创建 我的问题是,即使我删除了可滚动视图并将其设置为null,每次执行搜索并创建新的可滚动视图时,仪器中的活动字节仍会继续增加。我应该如何处理这些UI元素,以便垃圾收集删除它们 var v

我在Appcelerator中使用Alloy框架,在使用Apple Instruments测试我的应用程序时,一直在努力解决内存泄漏问题

我有一个可滚动视图,视图是该可滚动视图的视图或“页面”,视图如缩略图是“页面”视图的子视图。所有这些视图都是动态创建的,然后在用户执行重新加载可滚动视图内容的搜索时删除并重新创建

我的问题是,即使我删除了可滚动视图并将其设置为null,每次执行搜索并创建新的可滚动视图时,仪器中的活动字节仍会继续增加。我应该如何处理这些UI元素,以便垃圾收集删除它们

var videoSlider;

function loadData(searchTerms,channel,sortBy,limit) {
if (videoSlider) {
    $.scrollableViewHolder.remove(videoSlider);
    videoSlider = null;
}

videoSlider = Alloy.createController('videoSlider', {}).getView();
$.scrollableViewHolder.add(videoSlider);

var viewSliderArray = [];

feeds.GetFeeds({
    success: function(data) {
        Ti.API.info("Number of videos returned from Brightcove " + videosObject.items.length);
        var j = 0;
        for(var i=0; i<videosObject.items.length; i++) {
            if(i % 8 == 0) {
                Ti.API.info(i);
                if(i > 0) {
                    viewSliderArray.push(viewSlider);
                }
                viewSlider = Alloy.createController('viewSlider', {}).getView();
                j = 0;
            }

            tempTime = videosObject.items[i].length/1000;
            minutes = Math.round(tempTime/60);
            seconds = Math.round(tempTime%60);
            seconds = "0"+seconds;
            seconds = seconds.substr(seconds.length-2);

            videoLength = minutes+":"+seconds;

            videoBox = Alloy.createController('videoBox', {
                videoBoxTop: videoBoxTop[j],
                videoBoxLeft: videoBoxLeft[j],
                videoStill : videosObject.items[i].videoStillURL,
                videoTitle: videosObject.items[i].name,
                videoLength: videoLength
            }).getView();

            viewSlider.add(videoBox);
            j++;
        }
        viewSliderArray.push(viewSlider);

        Ti.API.info(viewSliderArray);

        videoSlider.views = viewSliderArray;
    }
},searchTerms,channel,sortBy,limit);

}
var视频滑块;
函数加载数据(搜索术语、频道、排序、限制){
if(视频滑块){
$.scrollableViewHolder.remove(视频滑块);
videoSlider=null;
}
videoSlider=Alloy.createController('videoSlider',{}).getView();
$.scrollableViewHolder.add(视频滑块);
var viewSliderArray=[];
feed.getfeed({
成功:功能(数据){
Ti.API.info(“从Brightcove返回的视频数量”+videosObject.items.length);
var j=0;
对于(变量i=0;i 0){
viewSliderArray.push(viewSlider);
}
viewSlider=Alloy.createController('viewSlider',{}).getView();
j=0;
}
TENTIME=videosObject.items[i].长度/1000;
分钟=数学四轮(TENTIME/60);
秒=数学圆(试探时间%60);
秒=“0”+秒;
秒=秒.substr(秒.长度-2);
视频长度=分钟+“:”+秒;
videoBox=Alloy.createController(“videoBox”{
videoBoxTop:videoBoxTop[j],
videoBoxLeft:videoBoxLeft[j],
videoStill:videosObject.items[i].videoStillURL,
videoTitle:videosObject.items[i].名称,
videoLength:videoLength
}).getView();
添加(视频框);
j++;
}
viewSliderArray.push(viewSlider);
Ti.API.info(viewSliderArray);
videoSlider.views=viewSliderArray;
}
},搜索词,频道,排序,限制);
}

从scrollview中删除所有子项并将其设置为null。以下是可能对您有用的示例代码:

exports.removeChildren = function(thisView){
if (thisView.children) 
{
    var removeData = [];
    for (var i = thisView.children.length; i > 0; i--)
    {
       removeData.push(thisView.children[i-1]);  
    };
    // Remove childrens
    for (var i = 0; i < removeData.length; i++)
    {
       thisView.remove(removeData[i]);
    }
    removeData = null;
}
}
exports.removeChildren=函数(thisView){
if(thisView.children)
{
var removeData=[];
对于(var i=thisView.children.length;i>0;i--)
 {
removeData.push(thisView.children[i-1])
   };
//删除儿童
对于(变量i=0;i
尝试使用此方法清理视图的内存

 clean(Your_View);
 Your_View = null;

function do_clean(e, c) {
    try{
        clean(c);
    e.remove(c);
    c = null;
    }catch(ex){
        Ti.API.info('Exception in removing child: '+ex +'children :'+c);
    }
    return;
}

function clean(e) {
    if (e != null) {
        if (e.children) {
            for (var i = 0; i < e.children.length; i++) {
                if(e.children[0] != undefined && e.children[0] != null)
                    do_clean(e, e.children[0]);
            }
        } else {
            return;
        }
    }
}
clean(您的视图);
您的视图=null;
清洁功能(e、c){
试一试{
清洁(c);
e、 删除(c);
c=零;
}捕获(ex){
Ti.API.info('删除子项时出现异常:'+ex+'children:'+c);
}
返回;
}
功能清洁(e){
如果(e!=null){
如果(如儿童){
for(var i=0;i

还要尝试删除所有不需要的EventListener。

您需要在scrollview上调用removeAllChildren,并将viewSliderArray设置为空数组,即viewSliderArray=[],否则将保留引用


此外,在使用仪器时,您可以搜索TiUI并查看哪个视图正在增加,这样您就可以锁定给您带来麻烦的特定视图。

您解决了这个问题吗?