[self anyFunction]を__weakオブジェクトなしのブロックで渡すことは可能ですか?[self anyFunction]を__weakオブジェクトなしのブロック(iOS 5 + ARC)
例として、これは、システムフレームワークから有効なコードである:
[UIView animateWithDuration:0.8 animations:^{
//Do animationStuff
} completion:^(BOOL finished) {
[self anyFunction];
}];
警告なしに完了ブロックに[self anyFunction]
を渡すことができます。しかし、完了ブロックを使用して独自のメソッドを作成すると、次の警告が発生します。このブロックで 'self'を強くキャプチャすると、保持サイクルが発生する可能性があります。
実用的な解決策は非常に簡単です(iOS 5 + ARC)。
__weak MyClass *weakSelf = self;
、あなたが呼び出す必要があり、完了ブロックで:
[weakSelf anyFunction];
しかし、戻って私の質問には:__weak
を使用できるのは、システムのフレームワークのAPIで必要がないのはなぜブロックを宣言するまで警告を表示せずにself
を使用してください。また、ブロック内に__weak
オブジェクトを必要とせずにメソッドを実装する方法は?
ありがとうございました。
ありがとうございます、私の質問が明らかになりました。 私の場合、ブロックを所有するオブジェクトは 'ivar'なので、' self 'の '__weak'オブジェクトを使う必要があります。しかし、ブロックが使われている関数でオブジェクトを宣言すると、 'self'は自分自身の' __weak'オブジェクトなしで渡すことができます。 これは意味があります。再度、感謝します。 – andreschneider
私が見つけたのは[self.ivar performBlock:^ {[self doSomething]; }];コンパイラの警告が表示され、[self performBlock:^ {[self doSomething]; }];コンパイラの警告は発生しません。 –
かもしれない[self performBlock:^ {[self doSomething];}];は、[self performBlock:^ {[self doSomething];自己= nil;}]; – dklt