私はこの問題を抱えています:ブロック内のブロック。
self.createStuff = ^ (NSString *text) {
self.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[self doMoreStuff]; // error here
};
[self doStuff] と [self doMoreStuff] でエラーが発生します。エラーは、このブロックで「自己」を強力にキャプチャしているため、保持サイクルが発生する可能性があります
簡単に言えば、追加するだけです
id mySelf = self;
最初のブロックの前に置き、代わりに mySelf を使用してください。
いいえ。mySelf が kind id であると、2 行目で必要な post プロパティが得られないため、これは私の問題を解決しません。だから私はそれを次のように宣言する必要があります
MyClass *mySelf = self;
次のようにします。
MyClass *mySelf = self;
self.createStuff = ^ (NSString *text) {
mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
[self doStuff]; // error here
};
[mySelf doMoreStuff];
};
OK、あなたが言うには、self.post.onCompletion 行と doMoreStuff はもう文句を言いませんが、onCompletion 内に別の自己があります...これはブロック内のブロックであるためです。のような別の弱参照を作成するプロセスを繰り返すことができます。これは、弱参照への弱参照でなければなりません。
MyClass *internalMyself = mySelf;
と使用
[internalMyself doStuff];
これは、これを行うための非常に哀れな方法のように思えます。このメソッドを実行すると、アプリがハングします。メソッドが実行される前に、参照のようなものが割り当て解除されています...
このシャレードを解決するにはどうすればよいですか?
ありがとう。
注:これはiOS 6+にコンパイルされています