__block
实质上是一个局部变量的作用域修饰符,它允许块修改在外部作用域中声明的局部变量的值。
您的_hintExist
变量不是本地变量。这是一个全球性的。所以不需要__block
修饰符。该块可以像访问同一文件中的任何其他代码一样访问全局变量。
如果您只是将static
添加到您的_hintExist
变量中,它仍然是一个全局变量,但现在仅限于此文件。和文件中的其他代码一样,块仍然可以访问和修改文件全局变量。
另一种选择是让_hintExist
变量像这样的局部静态变量:
- (void)showNotReachable
{
static bool _hintExist = false;
if (_hintExist) {
return;
}
NSLog(@"Show a hint");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_hintExist = NO;
});
}
该作品,以及假设它是你想要的。该变量的作用域仅限于该方法,但是静态的意思是该值独立于该类的任何特定实例。同样,static
表示您不需要__block
修饰符。这就像一个全球性的,但只在方法内部。
顺便说一句 - 关于常用命名约定的小调。不要为实例变量以外的变量使用前导下划线。
更新在此基础上回答以下安迪的第二个评论:
看来你真的想,因为你希望你的类的每个实例开始与_hintExist
自己的false
值用一个实例变量。
伊娃添加到@implementation
块:
@implementation WhateverClassThisIs {
bool _hintExist;
}
和更新的showNotReachable
方法:
- (void)showNotReachable
{
if (_hintExist) {
return;
}
NSLog(@"Show a hint");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_hintExist = NO;
});
}
像全局和静态,实例变量不需要__block
预选赛。并且,默认情况下,_hintExist
将具有初始值false
。
谢谢。如果我只是将静态添加到_hintExist变量中,它仍然是一个全局变量,但现在它的作用域仅限于此文件。你是什么意思范围只是这个文件?无论如何,其他文件无法获取_hintExist。顺便说一句,我使用下划线来表示全球性的,您如何做全球? –
哦,static bool _hintExist = false;这并不能解决我的问题。如果我在3秒内再次释放ViewController和init ViewController。 _hintExist仍然如此。当我再次启动ViewContoller时,我希望_hintExist = false。 –
如果使用本地'static'的方法不能满足您的需求,那么使用全球最初的方式也不会满足您的需求。除了范围的变化之外,他们的工作原理是一样的。从你的最新描述中,你想使用一个普通的实例变量。我已更新我的答案以反映这一点。 – rmaddy