Забавно, я только что сделал это предложение по другому вопросу.
Вы просто выставляете переменную, которая содержит экземпляр singleton, как саму глобальную. NSApp
на самом деле не сопоставляет с sharedApplication
вызовом. Это обычный старый указатель; во время запуска приложения он был настроен на , указывающий на тот же экземпляр, который вы получите от этого вызова.
Как и NSApp
, вы объявляете переменную для любого файла, который импортирует заголовок:
extern MySingleton * MySingletonInstance;
в заголовке (вы можете использовать APPKIT_EXTERN
, если хотите; документы указывают , что он все равно разрешается до extern
в ObjC в любом случае).
В файле реализации вы определяете переменную. Обычно переменная, содержащая общий экземпляр, объявляется static
, чтобы ограничить его связь с этим файлом. Если вы удалите static
, оператор определяет хранилище, которое «повторно объявлено» в заголовке.
Тогда используйте это, как вы делали раньше. Единственное предостережение в том, что вам по-прежнему нужно вызывать свой метод настройки singleton [MySingleton sharedInstance]
перед первым использованием глобала, чтобы убедиться, что он инициализирован. -applicationDidFinishLaunching:
может быть хорошим кандидатом на место для этого.
Что касается создания указателей на синглтоны фреймворка, вы можете просто спрятать результат [CocoaSingleton sharedInstance]
в любую переменную, какую захотите: ивар в классе, который хочет его использовать, локальную переменную или в глобальную переменную, которую вы инициализируете. очень рано в вашей программе через функцию, которую вы пишете.
Дело в том, что это не гарантирует, что не вызовет проблем. За исключением случая NSApp
(или если это где-то не задокументировано), на самом деле нет никакой гарантии, что объект, который вы получите от любого данного вызова sharedInstance
, останется живым, действительным или полезным после окончания стека вызовов. ,
Это может быть просто паранойей, но я бы посоветовал не делать этого, если только вы не найдете где-нибудь гарантии, что предполагаемые синглтоны, которые вас интересуют , всегда возвращают один и тот же экземпляр. В противном случае вы можете внезапно получить висящий глобальный указатель.
Обращаясь к вашему коду, объявление в вашем заголовке не создает переменную. Вам все еще нужно определение где-то:
// MySingletons.h
// Dear compiler, There exists a variable, NSNotifCenter, whose
// storage is elsewhere. I want to use that variable in this file.
extern id NSNotifCenter;
// MySingletons.m
// Dear compiler, please create this variable, reserving memory
// as necessary.
id NSNotifCenter;
@implementation MySingletons
// Now use the variable.
// etc.
Если вы создаете синглтон, возможно, вы захотите взглянуть на документацию Apple по синглтонам .