如何在Cocoa框架中定义全局变量

时间:2013-06-14 14:48:41

标签: objective-c xcode macos cocoa

构建Cocoa应用程序时,可以在AppDelegate类中添加所有全局方法和对象,并且在代码的任何位置,您都可以通过

访问AppDelegate
AppDelegate* appDlgt = (AppDelegate*)[[NSApplication sharedApplication] delegate];

但是我怎么能在Cocoa框架中做同样的事情呢?它似乎没有AppDelegete

由于

2 个答案:

答案 0 :(得分:2)

喜欢这个

+ (instancetype)sharedMyClass
{
    static id           kSharedMyClass = nil;
    static dispatch_once_t      theOnceToken;
    dispatch_once( &theOnceToken, ^{ kSharedMyClass = [[self alloc] init]; } );
    return kSharedMyClass;
}

答案 1 :(得分:1)

NSApp是NSApplication实例的快捷方式,NSApplication实例通常具有委托,或者更为古老的子类,您可以在其中存储数据。

所以如果您遵循默认项目模板:

((YourAppDelegate *)[NSApp delegate]).property

会让你到达你想去的地方

不要滥用它,因为你应该只在委托中存储属于应用程序的东西,即便如此,那些用户定义的属性应该是NSUserDefaults或包含在其他控制器类中。

编辑:对不起,我有点错过了这一点...... 如果您需要将更高级别的应用程序数据传递到框架中,那么您可以做很多事情,不知道哪些细节很难评论哪个最好......

一些选项:

在框架中使用您感兴趣的属性定义协议,在您的代理中采用该协议。

然后((id <FrameworkProtocol>)NSApp.delegate).protoProperty就可以了。

但是这引入了委托采用该协议的要求,您可以使用conformsToProtocol:方法检查该协议。