Я только что заметил довольно серьезную ошибку в своем приложении для iPhone / iPad: у меня есть класс с именем AppDelegate
, который реализует протокол UIApplicationDelegate
- как и в каждом приложении для iPhone. Я использую Core Data, и AppDelegate
устанавливает контекст моего управляемого объекта (в основном я просто оставил методы по умолчанию для шаблона Xcode на месте).
Теперь мне нужен контекст управляемого объекта в нескольких местах моего приложения, и я также хотел бы вызвать метод -saveContext
из нескольких мест. Поэтому я использовал шаблон синглтона и добавил метод класса + (AppDelegate *)sharedAppDelegate
, который реализован так:
+ (AppDelegate *)sharedAppDelegate
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred,^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
Пока все работало нормально. Однако теперь я попытался получить доступ к свойству sharedAppDelegate
UIWindow
и заметил, что это nil
. Сначала я был в замешательстве, но потом понял, что сначала мой main
метод создает экземпляр AppDelegate
, который создает UIWindow
и контроллеры представления в -application:didFinishLaunchingWithOptions:
, а затем -sharedAppDelegate
создает другой один ! Мне кажется очень странным, что мое приложение до сих пор работало достаточно хорошо, потому что, например, только первый экземпляр вызывает -saveContext
, когда приложение существует.
В любом случае, я бы хотел изменить его, чтобы метод main
также использовал sharedAppDelegate
. Значит ли это, что мне нужно переопределить метод -init
? Как я могу предотвратить бесконечный цикл (в конце концов -sharedAppDelegate
также вызывает init)? Должен ли я сделать _sharedObject
переменную глобальной области видимости?