更新:从接受的答案:
由于此变量的名称MyFirstVar与实例相同 在类中声明它隐藏实例变量,你有两个 不同的变量。
这让我感觉到了一些对我来说并不明显的事情,所以我只是把它放在顶部,以防它与其他人有关。
原帖:
显然这不起作用:
@interface MyDelegate: NSObject <NSApplicationDelegate>
{
NSString * const MyFirstVar;
NSString * const MySecondVar;
}
-(void)setSomeVars;
@end
@implementation MyDelegate
- (void)setSomeVars
{
NSString * const MyFirstVar = @"First Var";
NSString * const MySecondVar = @"Second Var";
NSLog(@"%@,%@",MyFirstVar,MySecondVar); // <--- This logs "First Var,Second Var"
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self setSomeVars];
NSLog(@"%@,%@",MyFirstVar,MySecondVar); // <--- This logs "(null),(null)"
}
@end
以粗体显示两条注释行。让我感到惊讶的是代码完成非常乐意使用这些变量并使用默认的警告/错误规则集,没有。
如果另一方面我使用:
{
__block NSString *MyFirstVar;
__block NSString *MySecondVar;
}
<德尔>和德尔>
{
MyFirstVar = @"First Var";
MySecondVar = @"Second Var";
}
...然后它按照需要工作,并在setSomeVars
方法之外的和内记录“First Var,Second Var”。
我这里的目标,作为一个学习练习(我真的不想要应用程序范围的变量),是能够引用变量的最新和最新的值;任何地方,任何时间,并能够通过调用setSomeVars
问题:
如何从整个应用程序中的任何代码块中访问这些变量,而不是调用setSomeVars
来评估它们到本地范围?
答案 0 :(得分:2)
当你写:
NSString * const MyFirstVar = @"First Var";
在setSomeVars
内部,您正在创建一个新的本地变量,该变量一直持续到setSomeVars
的调用结束。由于此变量MyFirstVar
的名称与类中声明的实例相同,因此隐藏实例变量,并且您有两个不同的变量。
只需将声明更改为:
MyFirstVar = @"First Var";
你可以访问现有的实例变量,没有两个变量,没有隐藏。
限定符__block
与块相关,不应在此处使用。
其他一些观点:
@interface
中声明实例变量。移动声明及其括号,{
&amp; }', to immediately follow the
@ implementation`。这隐藏了类外部的变量,因此改进了封装,这有利于程序结构,正确性和维护。HTH