2014-02-19 73 views
0

,并和我得到一个错误:全局变量崩溃我从来没有使用全局变量方案

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]]; 
+1

您可能想要了解编译器错误和程序崩溃之间的区别。 – paddy

+0

有可能有一百万更好的方法来解决这个问题。代表/协议。 NSNotificationCenter。 – nhgrif

回答

0

你看到的是一个链接错误。链接器注意到你的程序丢失了_serverName

这是一个声明extern NSString *serverName;

这是它的定义NSString * serverName = nil;

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

1)机会是一个变量可以staticstatic NSString * serverName = nil; // << in your *.m

2)如果一个全局变量extern是你需要什么,你需要提供其定义某个地方(除非你永远不引用它)。

0

如果您需要全局变量,则不需要声明它与externextern基本上意味着你想访问另一个文件中定义的全局变量。

使用静态而不是的extern当你想要一个全局变量只在那里它被定义的* .m文件访问。

如果你犯了一个全局变量未声明的静态,那么你就无法再为不同的变量,其他* .m文件(相反,你需要总是与的extern声明它重复使用相同的名称其他文件)。

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