【问题标题】:iOS: why can't I access a @property from a global Block (outside of method)iOS:为什么我不能从全局块(方法之外)访问@property
【发布时间】:2013-01-31 08:13:01
【问题描述】:

我正在尝试创建一个可以通过任何方法使用的全局块。我希望这个块访问类的@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

【问题讨论】:

  • 原因属性是一个实例变量,而不是一个类。作为一种解决方法,您可以使用属性创建单例或使用类访问器创建类变量。
  • 如果您显示您的实际代码,会更容易回答这个问题。
  • 您希望self 在这里出现什么对象?
  • 将 self 作为参数传入块

标签: ios objective-c properties objective-c-blocks block


【解决方案1】:

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

s_blockPtr = [block copy];

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      块什么都不是,它只是一个函数指针。如果你想访问块中的属性,你必须在属性中显式设置__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 线程时,函数不知道代码段中的全局变量,这就是它们无法访问的原因,因为它们在不同的线程中,这就是块在不同线程上运行的原因。 这样就解决了。

      【讨论】:

        【解决方案4】:

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

         @property(nonatomic,retain) __block NSString *strName;
        
          dispatch_async(dispatch_get_current_queue(), ^(void)
           {
              self.strName= @"XYZ";
           });
        

        【讨论】:

        • __block 存储类型只是用来告诉编译器应该如何捕获变量(即它应该是可变的还是应该被复制)。
        猜你喜欢
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多