【发布时间】:2023-03-18 07:55:02
【问题描述】:
背景
在 Cocoa 中,Apple 经常使用以下范例:
[NSApplication sharedApplication]
[NSNotificationCenter defaultNotificationCenter]
[NSGraphicsContext currentContext]
[NSCalendar currentCalendar]
等等。
他们偶尔也会使用我认为在处理大量代码时远更清晰易读的范例。
NSApp //which maps to [NSApplication sharedApplication]
目标
我希望能够在我自己的类和其他类的扩展中使用这种全局变量。
MYClassInstance
NSDefaultNotificationCenter
NSCal /* or */ NSCurrentCalendar
等等。
“废话”方法
#define。简单的#define NSCal [NSCalendar currentCalendar],但我们现在都知道,宏是邪恶的(或者他们是这么说的),而且它似乎不是正确的 Cocoa 方法。
苹果的方法
我能找到的关于NSApp 的唯一来源是APPKIT_EXTERN id NSApp;,它不是完全可重用的代码。除非我弄错了,否则所有这些代码都将NSApp 定义为id 周围的世界。不幸的是没有帮助。
关闭,但不完全
在我的搜索中,我设法找到了几条关于“全局常量”的线索,但是是这样的:
extern NSString * const StringConstant;
不幸的是,仅限于编译时常量,并且无法映射到必要的类方法。
底线
我希望能够推出我自己的 NSApp 风格的全局变量,它映射到像 [NSNotificationCenter defaultNotificationCenter] 这样的类方法。这可能吗?如果是这样,我应该怎么做?
进一步尝试
我正在尝试通过以下方式专门实现框架单例:
MySingletons.h
//...
extern id NSNotifCenter;
//...
MySingletons.m
//...
+(void)initialize
{
NSNotifCenter = [NSNotificationCenter defaultCenter];
}
//...
MyAppDelegate.m
//...
#import "MySingletons.h"
//...
//in applicationDidFinishLaunching:
[MySingletons initialize];
NSLog(@"%@", NSNotifCenter);
//...
但是,这会导致无法找到 _NSNotifCenter 符号的编译时错误。
目标!
我目前正在开发一个 Objective-C 类来封装我在这个问题中提到的一些框架单例。等我弄好这里把 GitHub 的信息加进去。
【问题讨论】:
-
在发布我的答案之前我可能读得太快了。您是在谈论为您的自己的单例还是为框架单例执行此操作?
-
最好两者都有。应该有什么特别的区别吗?
-
嗯,您可以直接访问保存自己的单例的变量,但不能访问框架类的变量。将扩展我的答案。
-
这句话:“映射到 [NSApplication sharedApplication]”是错误的,并引导你走上花园小路。正如您在“Apple 的方法”下指出的那样,NSApp 只是一个 ID。在您的代码中提及“NSApp”是不调用 [NSApplication sharedApplication];只是访问一个全局变量。
标签: objective-c cocoa macros global-variables class-method