1. ホーム
  2. objective-c

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

2023-10-01 17:02:20

質問

私はちょうどブロックに遭遇しました、そして、それは私が探しているものだと思います、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クラスを作成し、フェードアウトが終了したときに実行するためのブロックを保存したいからです。

ありがとうございます。

EDITです。 さて、提案を追加しましたが、まだ 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に格納することになれば 簡単に 保持サイクルを作成することができ、どちらも決して割り当て解除されないことになります。

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

- (void) someMethodWithAParameter:(id)aParameter {

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

  [self doSomethingWithBlock:tempFunction];

}

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