2012-03-01 24 views
2

我們構建了一個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),因爲它使用了太多的內存。

這是儀器顯示的內容: Instruments screenshot 應用程序下載的時間越長,百分比越高。

編輯:

去進一步向下透露,這是NSURLConnection的,這是搞亂內存。似乎我錯過了設置connectionreceivedDatanil(請參閱URL Loading System Programming Guide)。這再次改善了我的記憶使用情況。

現在,有兩個比較大的內存分配操作: enter image description here

這是我認爲屬於什麼儀器顯示代碼:

-(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的周圍添加另一個。

謝謝。

+0

'CFRunLoopRunInMode'本身可能並不真正分配太多內存。它只是等待事件,然後調用已經註冊的函數來處理這些事件。您需要在該大綱視圖中進一步鑽取以找出真正分配內存的內容。 – 2012-03-01 21:39:15

回答

1

這不是Core Foundation或ARC中的錯誤。這是你的代碼中的一個錯誤。

不要自己運行運行循環。只需使用+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]即可。當請求完成時,它會調用你的completionHandler塊。那是你處理迴應的時候。同時,退出您的方法並讓系統擔心運行運行循環。

你說「這是一個記憶問題」與NSRegularExpressionNSRunLoop,但你沒有說明問題是什麼,或者儀器向你展示的證據。如果你更詳細地描述「問題」,也許我們可以幫助你。

+0

感謝您的回覆。我只是延長了這個問題。我會檢查你的代碼的行爲。 – robbash 2012-03-01 12:58:29

+0

我試過'+ [NSURLConnection sendAsynchronousRequest:queue:completionHandler:]',但爲了讓它工作,我仍然需要循環等待,直到完成。 (不能嘗試使用隊列對象,因爲我不得不在應用中改變很多,而不知道這種方法是否會成功。)如您在上面的屏幕截圖中看到的,應用仍然分配了大量內存。我可以釋放這些嗎? – robbash 2012-03-05 16:43:16