2013-03-08 130 views
1

我有一個奇怪的問題。要求是從一個網址刷卡下載圖像,並在圖像視圖中顯示它。它工作得很好,但我收到30圖像後,並在幾次刷卡應用程序崩潰後的內存警告。下載圖像時iphone內存問題

實現非常簡單,但已經花了差不多2天時間才能找出問題所在。 在每個輕掃我打電話的方法: -

-(void)callDownloadImageAPI{ 

    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    [self loadIndicator:@"Please Wait.!!" :@"Please be patient while we are downloading image for you"]; 
    @try{ 
     DownloadImage *downLoadImge =[[DownloadImage alloc] init]; 
     downLoadImge.delegate=self; 
     [downLoadImge getImage:[self.allUrlArray objectAtIndex:self.initialImageViewCounter]]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"callDownloadImageAPI exception %@",[e description]); 
     [HUD hide:YES];   
    } 
    [pool release]; 
} 

此下載方式1,在一個實時圖像並傳送到的UIImage其委託

// DownloadImage.h的實施和.M

@protocol DownloadImageDelegate 
    @required 
    - (void)messageFormServerWithImage:(UIImage*)imageFromSever; 
    - (void)gettingImageFailed :(NSString*)errorDesc; 
    @end 



     @interface DownloadImage : NSObject 

     @property(strong) NSURLConnection*      connection; 
     @property(weak) id<DownloadImageDelegate>    delegate; 
     @property(strong) NSMutableData*       data; 

     -(void)getImage:(NSString *)imageUrl; 

//DownloadImage.m

NSUrlCo的
-(void)getImage:(NSString *)imageUrl{ 
    @autoreleasepool { 

     [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60]; 
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    } 
} 

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection { 
    @autoreleasepool { 

    NSLog(@"connectionDidFinishLoading"); 
    self.connection=nil; 
    if(self.data == nil) { 
     return; 
    } 

// NSString* jsonStr = [[NSString alloc] initWithData:self.data encoding:NSASCIIStringEncoding]; 
    UIImage *img=[UIImage imageWithData:self.data]; 
// NSArray *messages_json = [parser objectWithString:jsonStr error:nil]; 
    [self.delegate messageFormServerWithImage:img]; 
    self.data = nil; 
    img= nil; 
    } 
} 

其他代表nnections實現,但我不把它放在這裏。 一旦這個圖像被返回,我將此圖像設置爲滾動視圖並顯示它並從滾動視圖中刪除以前的圖像。

更多信息: -

只是爲了驗證我註釋掉設置圖像滾動型和剛剛下載的每一個刷卡的圖像,但它仍然崩潰各地30幅

令人驚訝的,我使用同一個類DownloadImage。 h和.m在同一工作中的其他地方下載圖像,即使使用500images也可以工作。

我在iPod Touch上測試和我檢查所使用的內存保持12-14mb之間(不可超過本)

請幫我傢伙,讓我知道,如果你需要更多的細節。

+0

你存儲的圖像?或只是在用戶刷卡時顯示它們?如果是第二個,請查看asyncImageView,它是一個ImageView替代品,可以異步顯示圖像並在需要時緩存它們。 – jcesarmobile 2013-03-08 09:00:18

+0

如果您使用ARC,則不應使用NSAutoReleasePool。而是使用@autoreleasepool。 – occulus 2013-03-08 09:02:19

+0

欲瞭解更多信息,請參閱http://stackoverflow.com/questions/9086913/objective-c-why-is-autorelease-autoreleasepool-still-needed-with-arc – occulus 2013-03-08 09:02:44

回答

1

由於所有圖像都存儲在虛擬內存中,因此需要對它們進行緩存,然後在用戶實際查看它們時將其加載回內存。

嘗試設置你的圖像對象爲零後,他們已被緩存或不需要。

在你的課程中,我還建議使用didReceiveMemoryWarning方法,並在調用這個方法時從內存中釋放一些圖像。

+0

感謝您的回答shoughton123。 我同意它可能在虛擬內存中。但對於您提供的答案,有一個疑問。即使爲了緩存圖片,我也需要第一次下載atleast,之後我正在緩存它,並從緩存中加載,但問題仍然存在。 在滑動本身我刪除除了可見的所有其他圖像,所以它甚至不應該達到didReceiveMemoryWarning – 2013-03-09 14:34:23