Memory leaks HTTPClient中的漏洞在哪里

Memory leaks HTTPClient中的漏洞在哪里,memory-leaks,titanium,titanium-mobile,titanium-alloy,appcelerator-alloy,Memory Leaks,Titanium,Titanium Mobile,Titanium Alloy,Appcelerator Alloy,我已经研究这个问题好几天了,但仍然不知道问题出在哪里 HTTPClient没有被正确清理,因此当循环下载100个图像时,应用程序内存会爆炸 我在使用appc new-t Tianium创建的简单合金模板中进行测试 只打开一个索引视图,其中一个按钮用于启动下载循环 我的索引文件如下所示: var max = 100 var i = 0 var c = Ti.Network.createHTTPClient(); c.onerror = function () { c = null; } c.

我已经研究这个问题好几天了,但仍然不知道问题出在哪里

HTTPClient没有被正确清理,因此当循环下载100个图像时,应用程序内存会爆炸

我在使用appc new-t Tianium创建的简单合金模板中进行测试

只打开一个索引视图,其中一个按钮用于启动下载循环

我的索引文件如下所示:

var max = 100
var i = 0

var c = Ti.Network.createHTTPClient();
c.onerror = function () {
  c = null;
}
c.onload = function () {
  saveFile(this.responseData)
  console.log("done get")
  i++
  getfiles()
}

function getfiles () {

  if (i < max) {

    try {
      c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
      c.send();
    } catch (e) {

    }
  } else {
    c = null
    console.log("finished")
  }
}

function saveFile (response) {

  console.log("STORING")

  var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'FS4931.jpg');
  f.write(response);

  if (f.exists() === false) {
    console.log("NOT STORED")
  } else {
    console.log("STORED")
  }

  f = null;

}


$.index.open();
var max=100
变量i=0
var c=Ti.Network.createHTTPClient();
c、 onerror=函数(){
c=零;
}
c、 onload=函数(){
保存文件(this.responseData)
log(“完成获取”)
我++
getfiles()
}
函数getfiles(){
如果(i
在应用程序启动后,最初内存约为30mb 到现在为止,一直都还不错 单击索引页上的“获取图像”按钮后,内存将增加到约62mb 过了一段时间,数据下降到约50mb,留下20mb的数据下落不明

我正在使用: Xcode 10.3 Ti SDK版本8.1.1.GA 模拟器:12.4版本的iPad Pro(第二代)

将最大值更改为1000时,内存将飙升至322mb左右,并且似乎不再减少

这是一个非常大的问题,当循环通过和下载比如2000张图片时,因为应用程序只是在某个点崩溃


感谢您的帮助

我对代码做了一些更改(对于循环,请使用
文件
属性,不要重复使用httpclient(查看文档),经典代码,以便更快地进行测试):

var w=Ti.UI.createWindow();
var b=Ti.UI.createButton({
标题:“下载”
});
w、 添加(b);
函数onError(e){
控制台日志(“错误”,e);
}
函数onLoad(e){
log(“完成获取”)
}
函数getfiles(e){
对于(变量i=0;i<100;++i){
var c=Ti.Network.createHTTPClient({
onerror:onerror,
加载:加载
});
c、 打开('获取',“https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
var fname=Ti.Filesystem.applicationSupportDirectory+“/”+(新日期().getTime())+“.jpg”;
console.log(“下载到”,fname);
c、 file=fname;
c、 send();
c=零;
fname=null;
}
}
b、 addEventListener(“单击”,获取文件);
w、 open();
当它释放内存(大约5mb)时,我会有一点开销。您可以创建JIRA票证(),以便他们可以检查它

var w = Ti.UI.createWindow();
var b = Ti.UI.createButton({
    title: "download"
});
w.add(b);

function onError(e) {
    console.log("error", e);
}

function onLoad(e) {
    console.log("done get")
}

function getfiles(e) {
    for (var i = 0; i < 100; ++i) {
        var c = Ti.Network.createHTTPClient({
            onerror: onError,
            onload: onLoad
        });
        c.open('GET', "https://cdn.fossilswitzerland.ch/large0/FS4931.jpg");
        var fname = Ti.Filesystem.applicationSupportDirectory + "/" + (new Date().getTime()) + ".jpg";
        console.log("Download to", fname);
        c.file = fname;
        c.send();
        c = null;
        fname = null;
    }
}
b.addEventListener("click", getfiles);
w.open();