通过不同的控制器使用extern变量

时间:2012-07-16 09:21:04

标签: objective-c xcode mkmapview global-variables viewcontroller

我正在尝试创建一个应用程序(使用故事板),我想用事件填充它。 在我的MapViewController.h中,我有:

#imports

extern NSMutableArray* events;

@interface MapViewController : etc, etc{
..
}

所以我想要的是能够导入这个.h文件,例如我的AppDelegate.m文件,并在appDidFinishLoading中执行以下操作:

Event *event =  [[Event alloc] init];
event.blabla = blabla;
...
[events addObject:event];

同时在我的MapViewController.m中我想要一个将这些事件添加到我的MKMapView(在我的mapviewcontroller中定义并称为worldView)的函数

这样:

@implementation MapViewController.m

-(void)setEvents{
    for(int i = 0; i<[events count]; i++)
        [worldView addAnnotation:[events objectAtIndex:i]];
}

...

正如您可能已经猜到的那样,在构建的链接部分出现以下错误时失败:

Undefined symbols for architecture armv7:
"_events", referenced from:
-[AppDelegate applicationdidFini... ]
-[MapViewController setEVents] in ...
..
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以..是的..请帮助^^

2 个答案:

答案 0 :(得分:0)

永远不要将全局变量用于这样的目的,它们是邪恶的。

更好地使用单例(即所谓的设计模式)方法创建类似“管理器”(例如EventManager类)的东西,以在独立控制器之间共享数据。

答案 1 :(得分:0)

有更好的模式,例如yan.kun提到的单例模式,但是你要做的就是将这行放在你的@implementation之外的AppDelegate.m中:

NSMutableArray* events;

这为它提供了一个全局空间,因此您不会收到链接器错误。然后,您需要在使用它的任何各种类之前初始化事件数组 。强有力地解决这个初始化问题是其他模式更好的原因之一。在你的情况下,你可以在你的AppDelegate中尽早完成这项工作,并完成启动方法。

P.S。如果必须使用全局变量,则不要将它们命名为“事件”,因为名称冲突的可能性非常高。