3

我是块新手。我在一个单身人士中,我这样做

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

我收到此错误使用未声明的标识符 self。

doStuff 是单例中的一个方法。

但是如果这个块是在另一个方法中声明的,Xcode 就可以了。

这是为什么?谢谢。

4

3 回答 3

2

你不应该self直接在一个块中调用。
相反,您应该从块中创建一个安全的块指针self并在块内访问它。

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

请参阅实现 API 时如何避免在块中捕获自我?更多细节。

于 2012-11-25T22:48:20.500 回答
2

您可以在界面中定义块并在 @implementation 文件中的任何方法(包括初始化程序)中进行初始化,如下所示:

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

@implementation YourClass

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


@end
于 2012-11-25T16:48:48.220 回答
0

因为每个方法都通过 self 作为隐藏参数。self 是一个和其他变量一样的变量,如果在方法中,块可以“看到它/捕获它”

如果它不在方法中,则 self 不是在任何地方设置的变量,并且该块无法“看到它”

于 2012-11-25T22:32:24.260 回答