全局变量崩溃程序

时间:2014-02-19 01:49:20

标签: ios variables global-variables

我从未使用全局变量,而且我收到错误:

Undefined symbols for architecture i386:
  "_serverName", referenced from:
      -[ANAdFetcher requestAdWithURL:] in ANAdFetcher.o
      -[AdSettingsTVC obtenerServidor:] in AdSettingsTVC.o
      -[ANAdFetcher requestAdWithURL:] in ANAdFetcher.o
      -[AdSettingsTVC obtenerServidor:] in AdSettingsTVC.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

代码:

<AdSettingTVC.h>

extern NSString *serverName;

<AdSettingsTVC.m>

- (IBAction)getServer:(UISegmentedControl *)sender{

    if (sender.selectedSegmentIndex == 0){
        serverName = @"Servidor 1";
    } else if (sender.selectedSegmentIndex == 1){
        serverName = @"Servidor 2";
    } else if (sender.selectedSegmentIndex == 2){
        serverName = @"Servidor 3";
    }
}

<AnAdFetcher.m>

self.URL = URL ? URL : [self adURLWithBaseURLString:[NSString stringWithFormat:@"http://%@", serverName]];

2 个答案:

答案 0 :(得分:0)

您看到的是链接器错误。链接器注意到您的程序缺少_serverName

这是声明extern NSString *serverName;

这是定义NSString * serverName = nil;

0)机会很好,全球在这里不是一个好主意。为什么不使用伊娃?

1)变量可能是staticstatic NSString * serverName = nil; // << in your *.m

2)如果您需要全局extern变量,则需要在某处提供其定义(除非您从未引用它)。

答案 1 :(得分:0)

如果需要全局变量,则无需使用 extern 声明它。 extern 基本上意味着您要访问另一个文件中定义的全局变量。

如果希望全局变量只能在定义它的* .m文件中访问,请使用 static 而不是 extern

如果你创建了一个全局变量而没有声明它 static ,那么你不能在其他* .m文件中为不同的变量再次使用相同的名称(相反,你需要始终用它来声明它 extern 在其他文件中。)

就个人而言,我建议重构以避免全局变量。或者至少使它成为静态。通过允许全局修改值,您可以使一些错误很难跟踪。