2016-05-31 14 views
2

AFnetworking2.6.3のUIImageView拡張を使用して、リモートサーバーからイメージを取得しようとしています。すべて正常に動作し、画像が返されて正常にレンダリングされます。私はXcode7.3.1でサイクル警告を保持取得:このブロックで強くキャプチャ「セル」は保持サイクルセルインスタンスがブロックで捕獲されたので、私は見ることができますサイクルを保持していませんが、まだサイクルの警告を保持していますか?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if(self.dataSourceModel) { 
     Model *model = self.dataSourceModel.items[indexPath.row]; 
     NSURL *url = [NSURL URLWithString:model.imageURL]; 
     NSURLRequest *theRequest = [NSURLRequest requestWithURL:url]; 
     UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"]; 

     //I don't use __weak cell in the block 
     [cell.imageView setImageWithURLRequest:theRequest placeholderImage:placeholderImage success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) { 
      cell.imageView.image = image; //get warning at this line 
      [cell setNeedsLayout]; 
     } failure:nil]; 
    } 
    return cell; 
} 

につながる可能性がありますブロックはセルインスタンス(およびcell.imageViewも同様)の所有権を持ちます。保持サイクルが実際に存在する場合、cellまたはimageViewはブロックの所有権を持つ必要があります。

しかし、私はUIImageView+AFNetworking.hUIImageView+AFNetworking.mのソースコードを見てきましたが、UIImageViewはブロックのプロパティを持っていません。ブロックはメソッドの単なるパラメータであり、インスタンス変数ではありません。 UITableViewCellにはブロックの所有権もありません。

リークを使ってチェックしても、リークはエラーを報告しませんでした。

私はここに保持サイクルはないと思いますが、なぜ私はここでもXcodeの警告を受けていますか? __weakセル__weak UITableViewCell *weakCell = cell;を使用すると、警告が消えます。しかし、私はまだ知りたいです:

  • ここに保持サイクルはありますか?
  • 本当に__weakセルを使用する必要がありますか?
  • または多分imageViewまたはセルは私が気づいていないブロックの所有権を持っていますか?

何かヒントがあれば、ありがとうございます。

答えて

1

確かに保持サイクルはなく、完了ブロックのコードを省略することで警告を回避できます。 AFNetworkingのimageViewサブクラス(行152)を見てみると、setImage...の頂点はイメージビューのイメージを設定することです。コードを再設定するか、レイアウトの状態を変更する必要があります。

if (self.dataSourceModel)も必要ありません。データソースが正しく構築されている場合は、tableView:numberOfRowsInSection:の行数に応答しました。モデルが空の場合、その答えはゼロであり、cellForRow...の呼び出しを避けています。

+0

ur返信用です。今私はそれがサイクルを保持していないことを確認します。しかし、私はあなたの意味を理解していない**完了ブロックのコードを省略します。**無駄な成功ブロックまたは空の成功ブロックを送信することを意味しますか? AFNetworking imageViewサブクラス(行152)を見てください。成功がnilの場合のみ、AFNetworkingは私のためにsetImageを設定します。だから私の理解が正しい場合、私はまだsetImageとsetNeedsLayoutをsuccessブロックで手動で呼び出す必要があると思います。 – Lyn

+0

Xcodeの警告なしでイメージを取得するために、「[cell.imageView setImageWithURLRequest:placeholderImage success:failure:];」というコード例を教えてください。 – Lyn

+0

@ Lyn、私はメソッドがゼロの完了ブロックでうまくいくはずだと思います。 (UIImageView + AFNetworking.mの149行目に 'if(success)'が表示されます。画像ビューに画像が生成されないのでしょうか?もし失敗した場合は、失敗ブロックを実装して何がうまくいかないのかのヒントを得ることができます。 – danh

関連する問題