我最近转换为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断点。所以他们都被正确地解放了。但我不明白为什么内存使用量在上传功能时会持续上升。 谢谢!
答案 0 :(得分:0)
我已经找到了问题,这是一个保留周期,它涉及我发布代码的类的父类。因为系统的这部分不是我写的,所以我错过了。我最终修复了使用块时指出保留周期的警告,并且内存泄漏消失了。