1

私は非常にがっかりしています。このメモリの問題を抱えてから 1 週間以上経ちましたが、解決策が見つかりません。

私のアプリは、Facebook の高解像度の写真をたくさん使用しています。

SDwebimageManager を使用して、すべての写真をダウンロードしてキャッシュします。

photoviewcontroller のインスタンスを作成すると、平均 40 枚の写真がダウンロードされてキャッシュされ、画面に表示されます。

ご想像のとおり、コントローラーのインスタンスごとにキャッシュを頻繁にクリアする必要があります。

しかし、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];
}

NSDictionary を使用してすべての写真を収集し、最後の写真がダウンロードされたら、コレクション ビューをリロードします。UI に戻ってコントローラーをリロードすると、メモリが増えてすぐに警告が表示され、アプリがクラッシュします。

SDCache でメモリ キャッシュをクリアしても何も起こりません。

この行の後に [image release] を置くと、非常に奇妙です:

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

SDImagecacheを呼び出すとメモリがクリアされますが、想像できるように...これを行うと...直後にコレクションビューでこの辞書「photosload」を使用します。すべての画像をリリースするため、コレクションビューでスクロールするとアプリがクラッシュします...

何が起こっているのか全く分からず、とてもがっかりしています...

あなたの助けを本当にありがとう、私はこのメモリの問題で完全に立ち往生しています

4

1 に答える 1

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ます.memcacheにそのようなURLがない場合、このURLの保存された画像をディスクで検索し、失敗した場合は画像のダウンロードとキャッシュを開始します. したがって、メモリ警告を受け取ったときSDImageCacheに呼び出すだけで済みます。clearMemory

于 2012-10-24T21:03:58.060 に答える