2010-09-17 70 views
0

在我的應用程序中,我有一堆不同的圖像包可供下載。這些圖像從我的網站上逐一下載。這些包包含100-1500個圖像,每個圖像大約100KB-200KB。iOS/iPad上的內存問題幫助

下載圖像時,我有一種方法可以選擇要下載的圖像,然後我有第二種方法根據主方法發送的參數進行實際下載。下面是下載方法的代碼:

-(BOOL) downloadImageName:(NSString *)imageName ImageGroup:(NSString *)imageGroup AndRow:(int)row { 

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES); 
    NSString *docsPath = [paths objectAtIndex:0]; 

    NSURL *downloadURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.website.com/%@_0001.jpg",imageName]]; 
    NSData *data = [NSData dataWithContentsOfURL:downloadURL]; 
    NSString *savePath = [NSString stringWithFormat:@"%@/%@^%@_%@.jpg",docsPath,currentServerCycle,imageGroup,imageName]; 
    BOOL downloaded = [data writeToFile:savePath atomically:YES]; 

    if (downloaded) 
      return YES; 
    } 

    else { 
    return NO; 
    } 
} 

我遇到的問題是這樣的:

當我與性能工具望着分配我看到該應用程序是保持mallocs運行這個(NSConcreteData )每次下載圖像時,只有在主方法(調用此下載方法的那個方法)完成時才釋放它們。這對於較小的圖像包來說很好,但是在我的總分配達到300 + MB(我的應用程序的正常分配量約爲3mb)之後,較大的分配顯然會崩潰。

它們沒有泄漏,因爲一旦圖像包下載並且方法結束,所有的malloc都不見了。

我試過手動分配和釋放NSData *數據,但它沒有效果。

回答

1

也許對象所在的autorelease池在main方法返回之前不會被排空。你可以嘗試添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在你的下載方法開始時,然後[pool drain];在從下載方法返回之前。無論您返回哪裏,您都需要確保您在返回之前釋放泳池,否則您會泄漏泳池。

而且,就像標準的Objective-C風格的一個點,你的方法應該命名爲:

- (BOOL)downloadImageName:(的NSString *)imageName imageGroup:(的NSString *)imageGroup andRow:(INT)行

用小寫字母開始「imageGroup:」和「andRow:」參數名稱。

+0

非常感謝!我從來沒有在一個方法上使用過自動釋放池,我之前並不打算在單獨的線程中使用它。並感謝您指出命名錯誤。 – Brodie 2010-09-17 23:50:25