73

ブロックに出くわしましたが、それらは私が探しているものだと思いますが、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];
}

私は数日間検索してきましたが、これが可能であるという証拠を見つけることができません.

これはまったく可能ですか、それとも意図されていないものにブロックを使用しようとしていますか?

ブロックを使用する理由は、Fader クラスを作成し、フェードアウトが終了したときに実行するブロックを保存したいからです。

ありがとうございました

編集:わかりました、提案に追加しましたが、まだ 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];
}

フェーダーに機能を持たせてはいけないのかな…?

4

6 に答える 6

142

はい、できます。

ただし、ブロックは保持されることに注意してくださいself。このブロックを ivar に格納することになった場合、保持サイクルを簡単に作成できます。つまり、どちらも割り当てが解除されることはありません。

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

- (void) someMethodWithAParameter:(id)aParameter {

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

  [self doSomethingWithBlock:tempFunction];

}

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

于 2011-02-16T23:45:01.590 に答える
3
__block CURRENTViewController *blocksafeSelf = self;

[homeHelper setRestAsCheckIn:strRestId :^(NSObject *temp) {
    [blocksafeSelf YOURMETHOD:params];
}];
于 2015-04-25T09:18:41.713 に答える
1

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

はい、そうではありません。あなたtempFunctionがインスタンスメソッドであれば、それを行うことができます。呼び出されたメソッドにアクセスできる必要があることが唯一の制限です。

于 2011-02-16T23:47:11.273 に答える
-1

[fader setFunction:tempFunction]; then は同期または非同期です。ブロックはスタックにプッシュされるため、MRR では保持しないと外れます。

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    void (^tempFunction)(void) = ^ {
        [self changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
    //if the tempFunction execute there will be right.
}//there the tempFunction pop off
 //....some thing go on
 //execute the tempFunction will go wrong.
于 2013-12-18T07:34:32.003 に答える