1

iOSでは、新しいUIImageを割り当てる前にUIImageView.imageを「nil」に設定する必要がありますか?

myUIImageView.image = nil;

myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];

これは正しい方法でしょうか?

4

3 に答える 3

2

参照カウントが心配な場合は、への明示的な代入nilは不要です。ARC では、.imageプロパティが自動的にそれを処理します (新しい画像が割り当てられたとき)。

設定nil 役立つのは、画像を使用していないことを明示的にマークしたいが、UIImageViewそれ自体を削除/削除したり、新しい画像を設定したくない場合です。そんな時は設定.image = nilがおすすめです。

于 2013-09-17T00:43:13.627 に答える
2

セッターを使用している場合は、プロパティを変更する前に nil に設定する必要はありません。セッターは、新しい参照を割り当てる前に現在の参照を解放します。

于 2013-09-17T00:43:37.070 に答える
1

ただし、このパターンは、再利用されるビュー (テーブル/コレクション ビュー セルなど) で画像を非同期に設定している場合に頻繁に見られます。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;
}
于 2013-09-17T01:32:14.700 に答える