В 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, когда сделаю это.