6

次のコードは、Apple が提供する LazyTableImages サンプル コードからのものです (ソースはこちら)。

彼らの完了ブロックには、保持サイクルを引き起こすはずの自己への参照があります...しかし、私の同様のコードでは、Xcodeではこれに対する警告は表示されません。

これは正しいです?

おそらく、私はこの微妙な点を見逃しています。

- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath
{
    IconDownloader *iconDownloader = [self.imageDownloadsInProgress objectForKey:indexPath];
    if (iconDownloader == nil) 
    {
        iconDownloader = [[IconDownloader alloc] init];
        iconDownloader.appRecord = appRecord;
        [iconDownloader setCompletionHandler:^{

            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

            // Display the newly loaded image
            cell.imageView.image = appRecord.appIcon;

            // Remove the IconDownloader from the in progress list.
            // This will result in it being deallocated.
            [self.imageDownloadsInProgress removeObjectForKey:indexPath];

        }];
        [self.imageDownloadsInProgress setObject:iconDownloader forKey:indexPath];
        [iconDownloader startDownload];  
    }
}
4

4 に答える 4

4

あなたが見ていると思われる保持サイクルは、オブジェクトがダウンローダをディクショナリに保持しているためです。

ブロック内に self への強い参照があるのは事実ですが、完了ハンドラーが常に実行されている限り、ダウンローダーは辞書から削除されます。最終的に、この辞書は空になります。つまり、自己を保持するオブジェクトがなくなり、保持サイクルがなくなります。

于 2013-07-27T19:08:41.140 に答える
0

コンパイラは、考えられるすべての保持サイクルをまだ検出できないため、警告はありません。

例えば:

- (void)foo 
{
    _block = ^ { [self done]; }; // Warning: Possible retain cycle

    DSGenericBlock foo = ^ { [self done] }; 
    _block = foo;  // No warning.
}

ブロックを「self」のインスタンス変数に直接割り当てると、「保持サイクルの可能性」という警告が表示されます。代わりに、ブロックは別のオブジェクトに割り当てられ、それが自己によって保持されるため、コンパイラは (サイクルが存在する場合でも) サイクルを検出しません。

于 2013-07-27T19:38:34.313 に答える
0

selfへの強力なポインターがありませんiconDownloader。このメソッドだけに作成され、スコープが設定されています。

IconDownloader *iconDownloader = [self.imageDownloadsInProgress objectForKey:indexPath];

iconDownloaderが強いプロパティ ( ) の場合self.iconDownloader、Xcode は強い参照サイクルを検出します。

于 2013-07-27T18:29:55.667 に答える
0

自分自身をキャプチャすることは、保持サイクルではありません。単体参考です。1 つの参照ではサイクルを構築できません。通常のアンチパターンは、追加のブロックへの参照が self の強力なプロパティに格納されることです。サイクルを構築する2つの参照があるよりも。

于 2013-07-27T18:40:46.597 に答える