4

1 つのオープンソース プロジェクトにコードがあります。

- (id) initWithContentPath: (NSString *) path parameters: (NSDictionary *) parameters
{
    NSAssert(path.length > 0, @"empty path");
    playPath = path;
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        _moviePosition = 0;
        _startTime = -1;
        self.wantsFullScreenLayout = YES;

        _decodeDuration = DEFAULT_DECODE_DURATION;
        _minBufferedDuration = LOCAL_BUFFERED_DURATION;

        _parameters = parameters;

        __weak KxMovieViewController *weakSelf = self;

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            NSError *error;
            KxMovieDecoder *decoder;
            decoder = [KxMovieDecoder movieDecoderWithContentPath:path error:&error];

            NSLog(@"KxMovie load video %@", path);

            __strong KxMovieViewController *strongSelf = weakSelf;
            if (strongSelf) {

                dispatch_sync(dispatch_get_main_queue(), ^{

                    [strongSelf setMovieDecoder:decoder withError:error];                    
                });
            }
        });
    }
    return self;
}

selfあるクラスをいつ強弱に設定する必要があるか知りたいですか?

4

2 に答える 2

5

強い参照は、参照しているオブジェクトがまだ使用されている間に割り当てが解除されないようにする場合に使用されます。参照は、参照しているオブジェクトの割り当てが解除されているかどうかを気にしない場合に使用されます。nilそのオブジェクトへの強参照がなくなると、弱参照が自動的に設定されます。

基本的に、オブジェクトへの強い参照が少なくとも 1 つある限り、割り当ては解除されません。強参照がなくなると、すべての弱参照 (存在する場合) が に設定されnilます。

于 2013-02-01T03:29:50.417 に答える
1

あなたが投稿したコードの明確な説明を探しているなら、私はそれを手助けしようとすることができます. 何が起こっているのかについての仮説を含む同様の質問を投稿し、仮説を検証または無効にするための回答を待っています。

私の質問はここにあります: SDWebImage コードで __weak と __strong の使用理由を説明してください

要約すると、次のようになります。このコードは、クラスのインスタンスを初期化しています。ただし、非同期ブロックを実行する必要があります。__weak および __strong キーワードは、非同期ブロックの実行中にインスタンスがまだ有効であることを確認するために使用されます。インスタンスの割り当てが解除されている場合は、アクション「setMovieDecoder」を実行する必要はありません。

特定の質問に答えるために、オブジェクト インスタンスを更新する必要がある非同期ブロックを実行していて、そのインスタンスを更新する必要がある場合は常に、このコード パターンを使用する必要があります。同期エンジンなどをダウンロードするだけの非同期ブロックでは、このコード パターンを使用しないでください。

**** 免責事項: 上記のコード パターンについて専門家の説明が得られることを期待して、私の洗練された質問に対する回答を確認してください。うまくいけば、私は正しいです。

于 2013-02-16T07:49:11.943 に答える