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



我正在尝试制作一个应用程序(使用故事板),我想用事件填充它。在我的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完成启动方法的早期就这样做。

附言:如果你必须使用全局变量,不要把它们笼统地命名为"事件",因为名称冲突的可能性很高。

相关内容

  • 没有找到相关文章

最新更新