iOSでは、新しいUIImageを割り当てる前にUIImageView.imageを「nil」に設定する必要がありますか?
myUIImageView.image = nil;
myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];
これは正しい方法でしょうか?
iOSでは、新しいUIImageを割り当てる前にUIImageView.imageを「nil」に設定する必要がありますか?
myUIImageView.image = nil;
myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];
これは正しい方法でしょうか?
参照カウントが心配な場合は、への明示的な代入nil
は不要です。ARC では、.image
プロパティが自動的にそれを処理します (新しい画像が割り当てられたとき)。
設定nil
が役立つのは、画像を使用していないことを明示的にマークしたいが、UIImageView
それ自体を削除/削除したり、新しい画像を設定したくない場合です。そんな時は設定.image = nil
がおすすめです。
セッターを使用している場合は、プロパティを変更する前に nil に設定する必要はありません。セッターは、新しい参照を割り当てる前に現在の参照を解放します。
ただし、このパターンは、再利用されるビュー (テーブル/コレクション ビュー セルなど) で画像を非同期に設定している場合に頻繁に見られます。image
ここではそうしていないように見えるので、をここに設定してnil
もあまり効果はありませんが、前述のシナリオは をクリアすることimage
が非常に重要な状況の 1 つです。ただし、(b) 非同期で画像を取得している場合、新しい画像が読み込まれるまで少し時間がかかることがありますnil
。
たとえばnil
、この状況では画像を次のように設定します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// configure the rest of the cell
// ok, now set the image
cell.myUIImageView.image = nil; // clear the image in case the cell has been reused
[self.networkQueue addOperationWithBlock:^{
UIImage *image = [self getImageFromNetworkForIndexPath:indexPath];
cell.myUIImageView.image = image;
}];
return cell;
}