私はブロックにぶつかりましたが、1つだけを除いて、それらは私が探しているものだと思います:ブロック内からメソッド[self methodName]を呼び出すことは可能ですか?
これは私がやろうとしていることです:
-(void)someFunction{
Fader* fader = [[Fader alloc]init];
void (^tempFunction)(void) = ^ {
[self changeWindow:game];
//changeWindow function is located in superclass
};
[fader setFunction:tempFunction];
}
私は数日間探していましたが、これが可能であるという証拠を見つけることができません。
これはまったく可能ですか、それとも意図していないものにブロックを使用しようとしていますか?
ブロックを使用している理由は、フェーダークラスを作成し、フェードアウトが終了したときに実行するブロックを保存したいからです。
ありがとうございました
編集:さて、提案に追加しましたが、まだEXC_BAD_ACCESSエラーが発生しています...
-(void)someFunction{
Fader* fader = [[Fader alloc]init];
__block MyScreen* me = self;
void (^tempFunction)(void) = ^ {
[me changeWindow:game];
//changeWindow function is located in superclass
};
[fader setFunction:tempFunction];
[fader release];
}
多分私はフェーダー関数を与えることを許されない...?
はい、これを行うことができます。
ただし、ブロックはself
を保持することに注意してください。このブロックをivarに保存してしまうと、easily保持サイクルを作成できます。つまり、どちらも割り当て解除されません。
これを回避するには、次のようにします。
- (void) someMethodWithAParameter:(id)aParameter {
__block MySelfType *blocksafeSelf = self;
void (^tempFunction)(void) = ^ {
[blocksafeSelf changeWindow:game];
};
[self doSomethingWithBlock:tempFunction];
}
__block
キーワードは、(特に)参照されるオブジェクトが保持されないことを意味します。
受け入れられる答えはoutdatedです。その場合に__block
を使用すると、エラーが発生する可能性があります!
この問題を回避するには、次のようにself
へのweak参照をキャプチャするのがベストプラクティスです。
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // capture the weak reference
// to avoid the reference cycle
}
}
詳細については、 Appleドキュメント-self をキャプチャするときに強い参照サイクルを回避するをご覧ください。
__block CURRENTViewController *blocksafeSelf = self;
[homeHelper setRestAsCheckIn:strRestId :^(NSObject *temp) {
[blocksafeSelf YOURMETHOD:params];
}];
ブロック内からメソッド[self methodName]を呼び出すことは可能ですか?
はい、なぜですか。 tempFunction
がインスタンスメソッドの場合は、実行できます。呼び出されるメソッドはアクセス可能である必要があり、唯一の制限です。