強いキーワードと弱いキーワードはよく理解していると思いますが、以下のコードでどのように使用されているのかわかりません。このコードは、githubで入手可能なOlivierPoitreyによるSDWebImageからのものです。ここで説明されているように、強いキーワードと弱いキーワードを理解しています:iOS5の強いストレージと弱いストレージの説明
以下のコードは、私が興味を持っている方法で__weakおよび__strongキーワードを使用しています。私は弱い使用を見るのに慣れているので、それは子供と親の関係や委任パターンではありません。ただし、他のコードで以前に見たように、これは頻繁に使用されるパターンであると確信しています。別のスレッドで実行されるブロックの前に__weak参照を設定します。次に、ブロック内で、弱参照を強参照に設定します。
私はこの優れたエレガントなコードを確信しているので、それを理解しようとしています。ブロックが実行される前に「自己」が存在しなくなると、弱い自己参照はゼロになります。ブロックが実行されると、ストロングリファレンスもゼロに設定されます。したがって、自己はもう存在しないので、残りの操作を強制終了することがわかります。私はこれを正しく理解しましたか?
さて、__weakキーワードと__strongキーワードを使用しなかった場合はどうなるでしょうか。ブロック内でself==nilかどうかをチェックした場合はどうなりますか。ブロックがツリー全体をコピーするので、「自己」がゼロになることはありませんか?
誰かがこの素晴らしいコードの謎を解くのを手伝ってもらえますか?誰かが私の仮説を検証または否認できますか?
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
[self cancelCurrentImageLoad];
self.image = placeholder;
if (url)
{
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}