1

自分自身を保持するブロックを使用する際に、強い参照循環を防ぐ方法を現在考えています。通常の方法は、自己への弱い参照を使用することです。

@property (strong, nonatomic) NSOperationQueue *queue;

- (void)methodA {
    __weak id *weakSelf = self;
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [weakSelf methodB];
    }];
    [self.queue addOperation:operation];
}

しかし、methodB が次のようになったらどうなるでしょうか。

- (void)methodB {
    [self someOtherMethod];
}

これは依然として強い参照サイクルを引き起こしますか? それとも、methodB は methodA から self への弱い参照を self への参照として受け取りますか? (つまり、methodB の self への参照は、methodA からの弱参照への単なる強参照ですか?)

4

2 に答える 2

1

それとも、methodB は methodA から self への弱い参照を self への参照として受け取りますか? (つまり、methodB の self への参照は、methodA からの弱参照への単なる強参照ですか?)

メソッドは、強参照または弱参照を「受け取り」ません。参考になります。「強い」または「弱い」は、変数 (通常は、インスタンス変数またはブロックによってキャプチャされた変数) にのみ適用されます。

weakSelfブロック内の弱参照です。weakSelfはゼロ化の弱い参照 ( ) であるため__weak、有効なオブジェクトを指しているか、その値が ですnil。前者の場合、有効なオブジェクトを指し、そのmethodB上で呼び出されます。後者の場合、メッセージを送信しnilても何も起こらないため、何も起こりません。

selfinmethodBが強い参照かどうかを尋ねます。強い参照とは、それが保持されることを意味するためself、 で強い参照があった場合、メソッドの最初でmethodB保持selfされ、最後に解放されることを意味します。しかし、メソッドが などの引数を保持するかどうかが問題になるのはなぜselfですか? 保持サイクルは、相互に強く参照しているオブジェクトを参照します。関数またはメソッドが実行されてから停止します。ローカル変数に対して行う保持は、メモリ管理規則によって一時的なものでなければならず、保持サイクルには影響しません。(技術的な答えはノーselfです。ARC には保持されません。MRC を含む引数selfは一般的に保持されません。しかし、私が言ったように、これは実際には関係ありません。)

于 2012-12-10T21:59:21.453 に答える
-1

私は最終的にこの質問に答えるドキュメントの一部を見つけました。したがって、methodB がブロックの自己への弱い参照を受け取っているように見えます。

于 2012-12-10T15:33:52.927 に答える