【问题标题】:How to define a global variable in a Cocoa Framework如何在 Cocoa 框架中定义全局变量
【发布时间】:2013-06-14 14:48:40
【问题描述】:

当你构建一个Cocoa App时,你可以在AppDelegate类中添加所有的全局方法和对象,在代码的任何地方,你都可以通过

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

但是我怎样才能在 Cocoa 框架中做同样的事情呢?好像没有AppDelegete

谢谢

【问题讨论】:

  • 仅供参考,这是非常糟糕的编程习惯。
  • @TheKraken 好的...请问推荐的编程习惯是什么?
  • 我建议这个:cocoawithlove.com/2008/11/…
  • 它并不比单身更邪恶。

标签: objective-c xcode macos cocoa


【解决方案1】:

这样

+ (instancetype)sharedMyClass
{
    static id           kSharedMyClass = nil;
    static dispatch_once_t      theOnceToken;
    dispatch_once( &theOnceToken, ^{ kSharedMyClass = [[self alloc] init]; } );
    return kSharedMyClass;
}
【解决方案2】:

NSApp 是您的 NSApplication 实例的快捷方式,它通常有一个委托,或者更古老地说,是一个可以存储数据的子类。

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

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

会带你去你想去的地方

不要滥用这一点,因为您应该只将属于应用程序的东西真正存储在委托中,即使这样,那些用户定义的属性也应该是 NSUserDefaults 或包含在其他一些控制器类中。

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

一些选项:

使用您感兴趣的属性在框架中定义一个协议,在您的委托中采用该协议。

那么((id <FrameworkProtocol>)NSApp.delegate).protoProperty就可以了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2018-01-27
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多