ブロックに弱い参照であるプロパティを持つクラスがあります。私はこのように、このブロックを使用して、クラス内の別のポイントで"self"をキャプチャするときに弱く保持されたブロックが保持サイクルを引き起こす方法
@interface BlockTest : NSObject
@property (nonatomic, weak) void(^testBlock)();
@end
:
- (void)foobar {
self.testBlock = ^{
[self doSomething];
};
}
コンパイラ(アップルLLVM 3.0)self
が強く、ここで捕獲されているため、保持サイクルがあるかもしれないと文句を言います。しかし、ブロック自体が__weak
の参照であるため、これが保持サイクルにどのようにつながるのか分からないので、うまくいくはずです。私がARCの弱い参照を正しく理解していれば、-foobar
メソッドが返されたときに、self.testBlock
に渡されたブロックは解放されなければならず、そうでなければself
を解放しなければなりません。
コンパイラーがまだ保持サイクルがあると思われる理由は何ですか?
あなたが持っているセットアップはかなり役に立たないです。ブロックは、関数への強い参照がないので、関数が終了した直後に割り当てが解除されます。プロパティは 'nil'になります。 – newacct
それは普遍的には当てはまりません。グローバルブロックとスタックブロックは保持または解放されないため、割り当て後も有効です(スタックブロックの場合は現在のスコープの終わりまで)。これは単なるサンプルです。アイデアはブロックを何かの周りに保つことではありませんでした。 IIRC私がこの質問をしたとき、私は警告をトリガーせずに 'self'というメソッドのコールバックブロックに' self'を取り込む方法を探していました。 – Alfonso