我是块新手。我在一个单身人士中,我这样做
void (^ myBlock)() = ^(){ [self doStuff]; };
我收到此错误使用未声明的标识符 self。
doStuff 是单例中的一个方法。
但是如果这个块是在另一个方法中声明的,Xcode 就可以了。
这是为什么?谢谢。
你不应该self
直接在一个块中调用。
相反,您应该从块中创建一个安全的块指针self
并在块内访问它。
__block id safeBlockSelf = self;
void (^ myBlock)() = ^(){ [safeBlockSelf doSomething]; };
请参阅实现 API 时如何避免在块中捕获自我?更多细节。
您可以在界面中定义块并在 @implementation 文件中的任何方法(包括初始化程序)中进行初始化,如下所示:
@interface YourClass {
void (^ myBlock)();
}
@implementation YourClass
- (void)yourMethod {
myBlock = ^(){ [self doStuff]; };
}
@end
因为每个方法都通过 self 作为隐藏参数。self 是一个和其他变量一样的变量,如果在方法中,块可以“看到它/捕获它”
如果它不在方法中,则 self 不是在任何地方设置的变量,并且该块无法“看到它”