2

我正在尝试创建一个可以通过任何方法使用的全局块。我希望这个块访问类的@properties。但是当我尝试这样做时,我得到“使用未声明的标识符自我”访问支持变量 _myVar 也不起作用。

为什么这不起作用?什么解决方法会给我一个可以从任何方法访问的块?谢谢。

一个例子:

@interface myClass()
@property (nonatomic,assign) BOOL subjectSex;
@end

@implementation

// these returns will get: use of undeclared identifier
int (^myBlock) = ^{

   if(self.subjectSex) return 1;  
   return (!_subjectSex);

}

@end
4

4 回答 4

2

您必须在实例方法中定义块。然后,您可以拥有一个所有方法都可以访问的静态块指针。当您将块分配给指针时,您必须复制它:

s_blockPtr = [block copy];

或者,您可以将 this 指针作为参数发送到块。它更容易理解,但可能需要更多的打字。

于 2013-01-31T08:47:37.560 回答
2

它与您使用的属性访问无关self。(您可以使用您可以毫无问题地访问的其他对象的属性。)self在该范围内不存在。self方法中的隐式参数。由于您的块定义不在方法内,因此没有命名变量self(除非您定义了一个名为 的全局变量self,但这可能不是一个好主意)。

于 2013-01-31T19:44:24.737 回答
0

块什么都不是,它只是一个函数指针。如果你想访问块中的属性,你必须在属性中显式设置__block,即你必须告诉编译器这是一个块类型的属性。让我们看一下块的闭包:假设有两个线程 T1 和 T2

  //T1 Thread
    void fun(int (*funptr)(int a,int b))
    {
       funptr(2,3);  
    }

    //T2 Thread
    int add(int a,int b)
{
     return a+b;
}
//Main Thread

    fun(&add);
    printf("Hello");

从上面的代码中,假设主线程地址是 20004 并且执行具有地址 20006 的 fun 并且 fun 以函数指针作为参数指向线程 T2 在地址 20064 的另一个函数,这意味着从线程 T1 和 T2 进行上下文切换,而执行 T2 线程,函数不知道代码段中的全局变量,这就是为什么它们无法访问,因为它们在不同的线程中,这就是块在不同的线程上运行的原因。这就是解决。

于 2016-03-21T08:01:41.767 回答
-3

您可以通过声明块类型来访问块中的任何对象

 @property(nonatomic,retain) __block NSString *strName;

  dispatch_async(dispatch_get_current_queue(), ^(void)
   {
      self.strName= @"XYZ";
   });
于 2013-01-31T08:23:43.713 回答