2012-10-24 91 views
1

我非常失望,因爲我有這個內存問題已經過了一個多星期了,我找不到解決方案。用SDWebimagemanager iOS清除內存iPhone

我的應用程序使用了很多來自Facebook的高分辨率照片。

我使用SDwebimageManager來下載和緩存我的所有照片。

當我創建一個我的photoviewcontroller實例時,平均有四十張照片被下載和緩存,並且出現在屏幕上。

正如你想象的那樣,我必須經常爲每個控制器實例清除Cache。

但是,我有一個問題SDWebimage我不能清除緩存...的自由物理內存大小滴速和我的應用程序崩潰總是很快

我用故事創造像控制器是(你可以看到我先清除緩存):

if([[segue identifier] isEqualToString:@"FriendView"]) 
{ 
    SDImageCache *imageCache = [SDImageCache sharedImageCache]; 
    [imageCache clearMemory]; 
    if (self.friends != nil) { 
     [self.friends release]; 
    } 
    NSString *s = [friendsid objectAtIndex:indexload]; 

    self.friends = (MyFriendViewController *)[segue destinationViewController]; 

    self.friends.friend = s; 
    self.friends.Manager = self.Manager; 
} 

而在我用我的經理下載每一張照片那樣的控制器:

for(int i=0;i<items.count;i++) { 
    [self.Manager downloadWithURL:[NSURL URLWithString:[self.items objectAtIndex:i]] 
    delegate:self 
    options:0 
    success:^(UIImage *image,BOOL cached)       
    { 
     [self.photosload setObject:image forKey:[NSString stringWithFormat:@"%i", i]]; 
     if (photosload.count == items.count) { 
      [self.collectionView reloadData]; 
     } 
    } 
    failure:nil]; 
} 

我使用NSDicti onary收集我的所有照片,並在最後一張照片下載時, 我重新加載我的收藏視圖。 如果我回到我的用戶界面並重新加載我的控制器,我的記憶就會增長,我很快就會發出警告......並且應用程序崩潰。

使用SDCache清除內存緩存時沒有任何反應。

這是非常奇怪的,因爲如果我把一個[圖像版本]這行後:當我打電話SDImagecache但

[self.photosload setObject:image forKey:[NSString stringWithFormat:@"%i", i]]; 
[image release]; 

我的記憶被清除,你可以想像......如果我這樣做... 我使用這個字典「photosload」與一個collectionview只是之後,因爲我釋放每個圖像我的應用程序崩潰,當我滾動collectionview ...

我完全失望我不知道發生了什麼事...

T hank真的爲你的幫助我完全堅持這個內存問題

回答

0

糾正我,如果我錯了,但我認爲你的問題是在下載所有項目,即使那些你不需要在這一刻。你同時在屏幕上顯示全部40個圖像嗎?我認爲你有一個集合視圖,同時只有幾個在屏幕上。

所以,如果我是對的,你不必在循環中下載所有這些文件,只在需要它們時下載它們,最常見的情況是當你顯示一個新的圖像。您將重新使用UIImageView並使用新的URL填充它。如果您正在使用SDImage庫,所以你必須載入圖像是這樣的:

[imageView setImageWithURL:[NSURL URLWithString:self.items objectAtIndex:i]] 
      placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

應該自動緩存圖像。當您收到內存警告時,應清除緩存,但這不會成爲問題。

這是怎麼SDImage作品:

當你調用[imageView setImageWithURL:URL placeholderImage:Image];它檢查memcache它,這只是NSDictionary,那麼,如果沒有這樣的URL在內存緩存它會搜索磁盤中保存的圖像此網址和如果失敗,它將開始下載並緩存圖像。因此,當您收到內存警告時,您只能使用SDImageCache撥打clearMemory

+0

謝謝您的回覆,我會嘗試你的想法,我並不在同一時間需要40張圖片,但我已下載的圖片之前,我重裝的CollectionView,因爲如果我滾動(加載照片是異步和隨機的),我看到空單元格太早了才成爲圖像。我想要一個完美的用戶體驗,當用戶滾動,我更喜歡沒有內存警告..是不可能清除緩存之前內存警告就像我已經做了我的例子? – user1772370

+0

只是嘗試一下,當你執行'setImageWithURL'時,它會取消之前的請求,因此它應該需要更多時間。我之前一直在使用這個庫,它對我來說工作得很好。 – Ezeki

+0

HM,你知道,你甚至不必調用'clearMemory'因爲'SDImageCache'是''UIApplicationDidReceiveMemoryWarningNotification一個觀察者,所以它會自動清除內存。 – Ezeki