2012-04-18 14 views
0

私は、非同期的にUITableView内のセルに画像をロードしています。コードは次のようになります。呼び出し元オブジェクトの割り当てが解除された場合、ディスパッチスレッドはどうなりますか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

// after getting the cell.. 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSString *imageUrl = [someMethodToGetImageUrl]; 
     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL imageUrl]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [UIImage imageWithData:imageData]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     }); 
    }); 

} 

これにtableViewの割り当てが解除された場合、それはディスパッチオフ発射した後、しかし、スレッドは、細胞の画像を設定しようとする完了する前に、私の質問は、(例えばnavigationControllerスタックからポップ)何が起こるかに関係します。セルも割り当てが解除され、そのセルに何かをしようとするとクラッシュするでしょうか?

私は上記のコードでクラッシュしていました。私はこれのtableViewにセグエ場合はすぐにその当時、私はライン上でクラッシュを取得:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

私はそれを変更した場合:

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

クラッシュが本当に作りしない、離れて行きます私に感覚。誰かが私になぜこれが理由であるか説明することができますか?ありがとう。

+0

ARCは有効になっていますか?どのようにプロパティが定義されているのですか(弱い、強い、コピーなど) –

+0

はい、ARCが有効になっていて、2番目の質問に対する答えが分かりません。私のコードスニペットの変数はどれもプロパティではありません。それらは単に[alloc]メソッドで割り当てられます。私は初心者です、あなたの質問に答えますか? – Steven

+0

私はこのコードスニペットで簡略化/隠蔽した1つのプロパティを持っています。 'someMethodToGetImageUrl'メソッドは実際に(非原子的、強い)として宣言されたプロパティオブジェクトのインスタンスメソッドです。 – Steven

答えて

2

ブロックを元の範囲外に保つルーチンは、それをコピーする必要があります。 dispatch_async()があります。

ブロックをコピーすると、ブロックが参照するオブジェクトポインタ変数がすべて保持されます。ブロックが暗黙的にインスタンス変数の形でselfにアクセスする場合、ブロックはselfを保持します。それはそれ自体がリリースされるまでこれらの参照を保持します。

この例では、ブロックが終了するまで、cellimageDataindexPath、およびtableViewはすべて保持されます。

関連する問題