我們構建了一個iPad應用程序,用於從Web服務(數據優先,稍後在後臺發佈文檔)中下載一堆數據和PDF文檔。爲此,我們通過HTTP(S)請求使用SOAP。它工作正常,完全,該應用程序運行良好。問題是,如果在某個時候下載的文檔太多,應用程序崩潰。使用工具我發現它是一個內存問題,特別是NSRegularExpression和NSRunLoop。 (我正在使用ARC)NSURLConnection弄糟了iPad內存
我可以改進我的代碼來優化NSRegularExpression創建。但我不知道如何改善NSRunLoop問題。
我嘗試了異步和同步HTTP請求。使用異步,我不得不等待下載完成,並從睡眠()/ [NSThread sleepForTimeInterval:]是不是一種選擇,我用
while (_waitToFinish) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
使用同步請求,儀器顯示,
[NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];
也在NSRunLoop的幫助下「等待」,同時也弄亂了內存。
這是CoreFoundation或ARC中的錯誤嗎?
在等待請求完成時是否有另一種空閒方式?
在此先感謝。
編輯:
隨着「內存問題」我的意思是應用程序崩潰(或者被打死的iOS),因爲它使用了太多的內存。
這是儀器顯示的內容: 應用程序下載的時間越長,百分比越高。
編輯:
去進一步向下透露,這是NSURLConnection的,這是搞亂內存。似乎我錯過了設置connection
和receivedData
到nil
(請參閱URL Loading System Programming Guide)。這再次改善了我的記憶使用情況。
現在,有兩個比較大的內存分配操作:
這是我認爲屬於什麼儀器顯示代碼:
-(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;
}
請問有什麼可以改變,以改善碼?
編輯:
編輯(從「NSRunLoop弄亂了iPad的存儲」變更名稱): 我創建了一個測試程序,以證明它是NSURLConnection的,那攪亂內存。然後我聯繫了Apple Developer Support。
由於我在NSURLConnection迭代中下載了大量PDF,因此解決方案是在迭代中添加@autoreleasepool { .. }
,並在NSRunLoop
的周圍添加另一個。
謝謝。
'CFRunLoopRunInMode'本身可能並不真正分配太多內存。它只是等待事件,然後調用已經註冊的函數來處理這些事件。您需要在該大綱視圖中進一步鑽取以找出真正分配內存的內容。 – 2012-03-01 21:39:15