0

我正在尝试制作一个应用程序(使用故事板),我想用事件填充它。在我的 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)

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

4

2 回答 2

0

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

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

于 2012-07-16T09:34:54.043 回答
0

有更好的模式,例如 yan.kun 提到的单例模式,但是您尝试做的事情的方式是将这一行放在 AppDelegate.m 之外@implementation

NSMutableArray* events;

这为其提供了一个全局空间,因此您不会收到链接器错误。然后,您需要在使用它的各种类中的任何一个需要它之前初始化 events 数组。稳健地解决这个初始化问题是其他模式更好的原因之一。在您的情况下,您可能可以在 AppDelegate 完成启动方法的早期就这样做。

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

于 2012-07-16T11:09:22.333 回答