私は、非同期的に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];
クラッシュが本当に作りしない、離れて行きます私に感覚。誰かが私になぜこれが理由であるか説明することができますか?ありがとう。
ARCは有効になっていますか?どのようにプロパティが定義されているのですか(弱い、強い、コピーなど) –
はい、ARCが有効になっていて、2番目の質問に対する答えが分かりません。私のコードスニペットの変数はどれもプロパティではありません。それらは単に[alloc]メソッドで割り当てられます。私は初心者です、あなたの質問に答えますか? – Steven
私はこのコードスニペットで簡略化/隠蔽した1つのプロパティを持っています。 'someMethodToGetImageUrl'メソッドは実際に(非原子的、強い)として宣言されたプロパティオブジェクトのインスタンスメソッドです。 – Steven