Objective c NSURLConnection弄乱了iPad的内存
我们构建了一个iPad应用程序,可以从web服务下载大量数据和PDF文档(首先是数据,然后是后台文档)。为此,我们通过HTTP(S)请求使用SOAP。它工作得很好,总的来说,应用程序运行得很好。问题是,如果有太多的文档需要下载,应用程序就会崩溃。使用仪器,我发现这是一个内存问题,尤其是NSRegularExpression和nsrunlop。(我正在使用ARC) 我可以改进代码以优化NSRegularExpression创建。但我不知道如何改进nsrunlop问题 我尝试了异步和同步HTTP请求。使用async时,我必须等待下载完成,因为sleep()/[NSThread sleepForTimeInterval:]不是一个选项,所以我使用Objective c NSURLConnection弄乱了iPad的内存,objective-c,ipad,memory-leaks,nsurlconnection,nsrunloop,Objective C,Ipad,Memory Leaks,Nsurlconnection,Nsrunloop,我们构建了一个iPad应用程序,可以从web服务下载大量数据和PDF文档(首先是数据,然后是后台文档)。为此,我们通过HTTP(S)请求使用SOAP。它工作得很好,总的来说,应用程序运行得很好。问题是,如果有太多的文档需要下载,应用程序就会崩溃。使用仪器,我发现这是一个内存问题,尤其是NSRegularExpression和nsrunlop。(我正在使用ARC) 我可以改进代码以优化NSRegularExpression创建。但我不知道如何改进nsrunlop问题 我尝试了异步和同步HTTP请求
while ( _waitToFinish ) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
使用同步请求,仪器显示
[NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];
还可以在nsrunlop的帮助下“等待”,并会弄乱内存
这是CoreFoundation还是ARC中的错误
在等待请求完成时,是否有其他方法空闲
提前谢谢
编辑:
对于“内存问题”,我的意思是应用程序崩溃(或被iOS杀死),因为它使用了太多内存
这就是仪器所显示的:
下载应用程序的时间越长,百分比越高
编辑:
再往下看,就是NSURLConnection,它正在破坏内存。似乎我不知何故错过了设置连接
和接收数据
到nil
(请参阅)。这又一次提高了我的内存使用率
现在,还有两个大内存分配操作:
这是我认为属于仪器显示的代码:
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[_receivedData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *responseText = [[NSString alloc] initWithBytes:[_receivedData mutableBytes] length:[_receivedData length] encoding:NSUTF8StringEncoding];
self.lastResponse = responseText;
responseText = nil;
connection = nil;
_receivedData = nil;
_lastResult = TRUE;
_waitToFinish = FALSE;
}
有什么我可以改变来改进代码的吗
编辑:(将标题从“nsrunlop弄乱iPad内存”更改为
编辑:
我创建了一个测试应用程序来证明是NSURLConnection弄乱了内存。然后我联系了苹果开发者支持
由于我在使用NSURLConnection的迭代中下载了大量PDF,解决方案是在迭代中添加一个@autoreleasepool{..}
,并在nsrunlop
周围添加另一个
谢谢。
< P>这不是核心基础或ARC中的错误。这是代码中的一个bug 不要自己运行跑步循环。只需使用+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:://code>。当请求完成时,它将调用您的completionHandler
块。这就是你处理回应的时候。同时,只需退出您的方法,让系统担心运行run循环
您使用NSRegularExpression
和nsrunlop
说“这是内存问题”,但您没有说明问题是什么,也没有说明仪器向您显示了什么证据。如果您能更详细地描述“问题”,也许我们可以帮助您。谢谢您的回复。我只是扩大了问题的范围。我将使用您建议的代码检查行为..我尝试了+[NSURLConnection sendAsynchronousRequest:queue:completionHandler://code>,但要使其正常工作,我仍然必须循环等待它完成。(无法尝试使用队列对象,因为我必须在不知道这种方法是否成功的情况下在应用程序中进行大量更改。)正如您在上面的屏幕截图中所看到的,应用程序仍然分配了大量内存。我可以释放这些吗?CFRunLoopRunInMode
本身可能没有分配太多内存。它只是等待事件,然后调用已注册的函数来处理这些事件。您需要在大纲视图中进一步深入了解,以找出真正分配内存的是什么。