2016-08-10 5 views
1

保持サイクルから来ているようなメモリリークがあります。自転車なしでサイクルを保持しますか?

- (void)nextPhoto { 
    self.photoIndex++; 
    if (self.photoIndex >= [self.photos count]) { 
     self.photoIndex = 0; 
    } 
    __weak Photo *photo = [self.photos objectAtIndex:self.photoIndex]; 
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:photo.thumbnailURLString] options:SDWebImageRetryFailed progress:nil 
               completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 

               }]; 
} 

コードは2秒タイマーでループしている:

self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPhoto) userInfo:nil repeats:YES]; 

総メモリ使用増加を際限なく私は、メモリの使いすぎのイベントを取得するまで、メモリ割り当てサイズは、このコードが実行されるたびに増加しています。

なぜこのコードは保持サイクルを引き起こしていますか?このような状況で自己を扱う特別な方法はありますか?

self.photosNSMutableArray

self.photoIndexあるNSInteger

SDWebImageManagerでよく維持ライブラリです:私は何の問題が表示されていないhttps://github.com/rs/SDWebImageと私は問題なく

+0

プロパティで '[SDWebImageManager sharedManager]'を移動しようとしましたか?そして、完成ブロックの中にコードを投稿できますか? –

+0

すべての画像をダウンロードした後にダウンロードを停止するのではなく、0インデックスから画像をダウンロードし直すのはなぜですか?また、タイマーは毎回の間隔の後にこのメソッドを同期させます。 –

+0

@SaintThread完了ブロックからすべてのコードを削除しましたが、メモリリークの原因となりました。 – Cbas

答えて

1

と、他の多くの場所でそれを使用します補完ブロックで自己を使用していてもここに保持サイクルが含まれます。ブロック所有者はSDWebImageManagerなので、ここで問題はありません。ブロックをviewControllerのプロパティに格納すると保持サイクルが発生し、ブロックを保持するブロックが発生する可能性があります。ここでは何が起こっているのかはわかりません。

あなたの問題は、私はUIImageから来ると推測します。私はあなたがブロックの中で何をするかによって異なりますが、イメージを保存する場合は、2秒ごとに新しいものが作成され、最終的には失敗します。既にダウンロードされているイメージのキャッシュを保持し、必要な場合にのみダウンロードしようとします... URLをキーにしてNSDictionaryを追加し、たとえばUIImageを値として追加します。

+0

完了ブロックにコードがありません。また、SDWebImageManagerはすでにキャッシュを処理しています – Cbas

0

いいえ私はこの1つで眠っていたはずです...機能は実際には正確に動作しており、境界なしで増加していたself.photosでした。その配列のサイズを制限することで、 "リーク"が修正されました。

関連する問題