【问题标题】:Memory Leak using ASIHTTPRequest appendPostData with ARC使用 ASIHTTPRequest appendPostData 和 ARC 的内存泄漏
【发布时间】:2014-01-29 17:32:03
【问题描述】:

最近已转换为 ARC 的上传速度测试功能出现内存泄漏。我相信我已经遵守了 ARC 的内存管理指南。 问题似乎与我为上传测试创建的随机数据有关。它的内存似乎没有被释放。
这里是我创建上传数据和 ASIHTTPRequest 对象的地方:

ASIHTTPRequest *request0 = [ASIHTTPRequest requestWithURL:uploadTestURL];
__weak ASIHTTPRequest *request = request0;

NSData *uploadData ;
if ([speedTier isEqualToString:@"Wifi"]) {
    uploadData  = [self createRandomNSDataOfSize:1000000];
}else
{
    uploadData  = [self createRandomNSDataOfSize:4000000];
}

[request appendPostData:uploadData];

实际创建数据的函数是:

NSMutableData* theData = [NSMutableData dataWithCapacity:size];
for( unsigned int i = 0 ; i < size/4 ; ++i )
{
    u_int32_t randomBits = arc4random();
    [theData appendBytes:(void*)&randomBits length:4];
}
return theData;

然后我继续为 setBytesSentBlock 设置块,我在其中管理上传的图形和上传终止的时刻。部分代码如下:

 [request0 setBytesSentBlock:^(unsigned long long size, unsigned long long total) {

    double timeDiffereceFromStart = [[NSDate date] timeIntervalSinceDate:start];

    if (totalUploadSize == 0)
    {
        start=[NSDate date];
        totalUploadSize = [request.postBody length];
        return;
    }
    if(startPosition == 0 && timeDiffereceFromStart >= 1)//[request totalBytesSent] > 20000)
    {
        startPosition = [request totalBytesSent];
        start=[NSDate date];
        return;
    }

我刚刚发布了一些代码,但想说明我在块中使用变量“请求”的位置。我很确定我已经解决了循环保留问题,但我想确保没有其他问题。

我应该注意的另一件事是 - 我在 ASIHTTPRequest dealloc 函数中设置了一个断点。我创建的所有这种类型的对象都命中了 dealloc 断点。所以他们都被正确地释放了。但是我不明白为什么当它达到上传功能时内存使用量会不断上升。 谢谢!

【问题讨论】:

  • 查看this question接受的答案
  • 嗨,Niraj,您的意思是我应该改用 AFNetworking 吗?这个问题是由我的 ARC 代码和不是 ARC 的 ASIHTTPRequest 之间的交互引起的吗?
  • 你在哪里看到内存增加了?调试导航器还是在仪器中?
  • @Putz1103,两者都有。在分配工具中,但不是内存泄漏工具。分配工具指向上传函数中的 setBytesSentBlock。另外,当我将上传数据的大小减小到400k时,内存的增加也减少了。
  • 那么在分配工具中,使用这些函数时“活动字节”会不断增加? (对不起,我很笨,我只是想很清楚你的情况)。

标签: ios objective-c memory-management memory-leaks asihttprequest


【解决方案1】:

我已经解决了这个问题,这是一个保留周期,它涉及我发布代码的类的父类。因为系统的这一部分不是我写的,所以我错过了。我最终修复了在使用块时指出保留周期的警告,并且内存泄漏消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2012-09-14
    • 2012-02-20
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多