使Objective C变量可访问外部方法,同时允许仍然调用方法来更新值

时间:2017-08-01 03:54:27

标签: objective-c

更新:从接受的答案:

  

由于此变量的名称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来评估它们到本地范围?

1 个答案:

答案 0 :(得分:2)

当你写:

NSString * const MyFirstVar = @"First Var";

setSomeVars内部,您正在创建一个新的本地变量,该变量一直持续到setSomeVars的调用结束。由于此变量MyFirstVar的名称与类中声明的实例相同,因此隐藏实例变量,并且您有两个不同的变量。

只需将声明更改为:

MyFirstVar = @"First Var";

你可以访问现有的实例变量,没有两个变量,没有隐藏。

限定符__block与块相关,不应在此处使用。

其他一些观点:

  • 不再推荐在@interface中声明实例变量。移动声明及其括号,{&amp; }', to immediately follow the @ implementation`。这隐藏了类外部的变量,因此改进了封装,这有利于程序结构,正确性和维护。
  • 通常使用小写字母和带有大写字母的类名称来启动变量和方法名称。您为变量使用了大写字母,这就是语法着色错误的原因。

HTH