我是块新手。我在单身人士中,我这样做
void (^ myBlock)() = ^(){ [self doStuff]; };
我收到此错误使用未声明的标识符self。
doStuff是单例内的一个方法。
但是如果在另一个方法中声明了这个块,那么Xcode就可以了。
为什么?感谢。
答案 0 :(得分:2)
您可以在界面中定义块,并在@implementation文件中的任何方法(包括初始值设定项)中进行初始化,如下所示:
@interface YourClass {
void (^ myBlock)();
}
@implementation YourClass
- (void)yourMethod {
myBlock = ^(){ [self doStuff]; };
}
@end
答案 1 :(得分:1)
您不应直接在一个区块中致电self
相反,您应该从self
创建一个安全的块指针并在块内访问它。
__block id safeBlockSelf = self;
void (^ myBlock)() = ^(){ [safeBlockSelf doSomething]; };
有关详细信息,请参阅How do I avoid capturing self in blocks when implementing an API?。
答案 2 :(得分:0)
因为每个方法都作为一个隐藏的参数传递给自己。 self就像其他任何变量一样,如果在方法
中,块可以“看到它/捕获它”如果它不在某个方法中,则self不是任何位置的变量集,并且块不能“看到它”