3

私はブロックに不慣れです。私はシングルトンの中にいて、これを行います

void (^ myBlock)() = ^(){ [self doStuff]; };

宣言されていない識別子selfのこのエラー使用を受け取ります。

doStuffは、シングルトン内のメソッドです。

ただし、このブロックが別のメソッド内で宣言されている場合、Xcodeは問題ありません。

何故ですか?ありがとう。

4

3 に答える 3

2

インターフェイスでブロックを定義し、次のように@implementationファイルの任意のメソッド(初期化子を含む)で初期化できます。

@interface YourClass {
   void (^ myBlock)();
}

@implementation YourClass

  - (void)yourMethod {
    myBlock = ^(){ [self doStuff]; };
  }


@end
于 2012-11-25T16:48:48.220 に答える
2

selfブロック内で直接呼び出すべきではありません。
むしろself、ブロック内から安全なブロックポインタを作成してアクセスする必要があります。

__block id safeBlockSelf = self;
void (^ myBlock)() = ^(){ [safeBlockSelf doSomething]; };

APIを実装するときにブロックに自分自身をキャプチャしないようにするにはどうすればよいですか?を参照してください。詳細については。

于 2012-11-25T22:48:20.500 に答える
0

すべてのメソッドが非表示のパラメータとして自分自身を渡すためです。selfは他の変数と同様に変数であり、メソッド内の場合、ブロックは「それを表示/キャプチャ」できます

それがメソッドにない場合、selfはどこにも設定された変数ではなく、ブロックは「それを見る」ことができません

于 2012-11-25T22:32:24.260 に答える