我正在尝试制作一个应用程序(使用故事板),我想用事件填充它。在我的MapViewController.h中,我有:
#imports
extern NSMutableArray* events;
@interface MapViewController : etc, etc{
..
}
因此,我想要的是能够在例如我的AppDelegate.m文件中导入这个.h文件,并在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)
所以。。是 啊请帮助^^
永远不要为了这样的目的使用全局变量,它们是邪恶的
更好地使用基于单例(即所谓的设计模式)的方法来创建类似于"管理器"(例如EventManager类)的东西,以在独立控制器之间共享数据。
有更好的模式,比如yan.kun提到的singleton模式,但您要做的事情是将这一行放在@implementation
:之外的AppDelegate.m中
NSMutableArray* events;
这为它提供了一个全局空间,因此您不会得到链接器错误。然后,您需要初始化事件数组,然后使用它的任何不同类都需要它。稳健地解决这个初始化问题是其他模式更好的原因之一。在您的情况下,您可能可以在AppDelegate完成启动方法的早期就这样做。
附言:如果你必须使用全局变量,不要把它们笼统地命名为"事件",因为名称冲突的可能性很高。