web-dev-qa-db-ja.com

ブロック内から[self methodName]を呼び出しますか?

私はブロックにぶつかりましたが、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];
}

多分私はフェーダー関数を与えることを許されない...?

72
Marty

はい、これを行うことができます。

ただし、ブロックはselfを保持することに注意してください。このブロックをivarに保存してしまうと、easily保持サイクルを作成できます。つまり、どちらも割り当て解除されません。

これを回避するには、次のようにします。

- (void) someMethodWithAParameter:(id)aParameter {

  __block MySelfType *blocksafeSelf = self;
  void (^tempFunction)(void) = ^ {
      [blocksafeSelf changeWindow:game];
  };

  [self doSomethingWithBlock:tempFunction];

}

__blockキーワードは、(特に)参照されるオブジェクトが保持されないことを意味します。

139
Dave DeLong

受け入れられる答えは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 をキャプチャするときに強い参照サイクルを回避するをご覧ください。

22
skywinder
__block CURRENTViewController *blocksafeSelf = self;

[homeHelper setRestAsCheckIn:strRestId :^(NSObject *temp) {
    [blocksafeSelf YOURMETHOD:params];
}];
3
Ketan Patel

ブロック内からメソッド[self methodName]を呼び出すことは可能ですか?

はい、なぜですか。 tempFunctionがインスタンスメソッドの場合は、実行できます。呼び出されるメソッドはアクセス可能である必要があり、唯一の制限です。

1
Mahesh