Глобальные переменные для методов класса

Справочная информация

В Cocoa компания Apple часто использует следующую парадигму:

[NSApplication sharedApplication]
[NSNotificationCenter defaultNotificationCenter]
[NSGraphicsContext currentContext]
[NSCalendar currentCalendar]

и т. д.

Они также иногда используют парадигму, которая, по моему мнению, является гораздо более понятной при работе с огромными объемами кода.

NSApp //which maps to [NSApplication sharedApplication]

Цель

Я бы хотел иметь возможность использовать такого рода глобальные переменные как в своих собственных классах, так и в расширениях других классов.

MYClassInstance
NSDefaultNotificationCenter
NSCal /* or */ NSCurrentCalendar

и так далее.

Подход "duh"

#define. Просто #define NSCal [NSCalendar currentCalendar], но, как мы все уже знаем, макросы - зло (или так говорят), и это не похоже на правильный способ работы с Cocoa.

Подход Apple

Единственным источником, который я смог найти относительно 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, когда сделаю это.

6
задан Patrick Perini 16 December 2011 в 03:31
поделиться