iOS块 - 使用未声明的标识符self

时间:2012-11-25 16:42:23

标签: iphone ios ipad block

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

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

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

doStuff是单例内的一个方法。

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

为什么?感谢。

3 个答案:

答案 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不是任何位置的变量集,并且块不能“看到它”