内存泄漏使用ASIHTTPRequest appendPostData和ARC

时间:2014-01-29 17:32:04

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

我最近转换为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;
    }

我刚刚发布了一些代码,但想要显示我在块中使用变量'request'的位置。我很确定我已经解决了循环保留问题,但我想确保没有其他问题。

关于其他事情,我应该注意 - 我在ASIHTTPRequest dealloc函数中设置了一个断点。我创建的这种类型的所有对象都击中了dealloc断点。所以他们都被正确地解放了。但我不明白为什么内存使用量在上传功能时会持续上升。 谢谢!

1 个答案:

答案 0 :(得分:0)

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