2015-05-14 24 views
0
bool _hintExist; 
- (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; 
    }); 
} 

上面的代码很好。有一个按钮可以触发该方法。其实,我不需要_hintExist是一个全局变量。我想在方法中使用bool _hintExist。但是,当我试图在bool _hintExist前添加static和__block时。会有一个编译错误。我很惊讶,如果我把它作为一个全局变量,我可以在块中更改_hintExist。有人能解释为什么吗?如果我在代码中的全局变量bool _notReachableHintExist之前添加静态,有什么区别?如何使静态和__block布尔值?在iOS?

回答

5

__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

+0

谢谢。如果我只是将静态添加到_hintExist变量中,它仍然是一个全局变量,但现在它的作用域仅限于此文件。你是什​​么意思范围只是这个文件?无论如何,其他文件无法获取_hintExist。顺便说一句,我使用下划线来表示全球性的,您如何做全球? –

+0

哦,static bool _hintExist = false;这并不能解决我的问题。如果我在3秒内再次释放ViewController和init ViewController。 _hintExist仍然如此。当我再次启动ViewContoller时,我希望_hintExist = false。 –

+0

如果使用本地'static'的方法不能满足您的需求,那么使用全球最初的方式也不会满足您的需求。除了范围的变化之外,他们的工作原理是一样的。从你的最新描述中,你想使用一个普通的实例变量。我已更新我的答案以反映这一点。 – rmaddy