【发布时间】: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