我正在尝试创建一个可以从任何方法使用的全局块。我希望这个块能够访问该类的@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
答案 0 :(得分:2)
您必须在实例方法中定义块。然后,您可以拥有一个所有方法都可以访问的静态块指针。将块指定给指针时,必须复制它:
s_blockPtr = [block copy];
或者,您可以将此指针作为参数发送到块。它更容易理解,但可能更多的打字。
答案 1 :(得分:2)
与使用self
的属性访问并没有多大关系。 (您可以使用您可以访问的其他对象的属性而不会出现问题。)self
在该范围内不存在。 self
是方法中的隐式参数。由于您的块定义不在方法内部,因此没有名为self
的变量(除非您定义名为self
的全局变量,但这可能是个坏主意。)
答案 2 :(得分: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的乐趣,并且有趣的是将函数指针作为参数指向20064地址处的线程T2的另一个函数,这意味着从线程T1和T2,在执行T2线程时,函数不知道代码段中的全局变量,因为它们在不同的线程中,因此它们无法访问,这就是块在不同线程上运行的原因。 那就解决了。
答案 3 :(得分:-3)
您可以通过声明块类型
来访问块中的任何对象 @property(nonatomic,retain) __block NSString *strName;
dispatch_async(dispatch_get_current_queue(), ^(void)
{
self.strName= @"XYZ";
});