Использование [NSObject load] для инициализированной системы без пула автоматического выпуска

Я пишу приложение для iPad с использованием Xcode 4.3.2 и симулятора iOS. У меня есть серия классов, которые я хочу зарегистрировать с помощью синглтона при запуске, чтобы другие классы могли запрашивать услуги через этот синглтон, которые предоставляются этими зарегистрированными классами.

Чтобы добиться такого поведения, я полагался на переопределение метода класса нагрузки в NSObject. Однако я обнаружил, что весь код, выполняемый методом load, находится за пределами основной функции, прежде чем появляется какая-либо возможность настроить пул автоматического выпуска. Я использую в своем приложении какую-то стороннюю технологию, которая в настоящее время запрещает использование или автоматический подсчет ссылок, поэтому мне нужно полагаться на пул автоматического выпуска, чтобы помочь управлять временем жизни созданных объектов.

В процессе регистрации на консоли отладки появляется ряд сообщений с жалобами на то, что авто-релиз вызывается без пула авто-релиза. Один из них связан со словарем, выделенным синглтоном. Другие связаны с блочными объектами, которые копируются из стека и сохраняются в этом одноэлементном словаре.

Мне не ясно, насколько серьезны эти отладочные сообщения. Я подозреваю, что размещение словаря может быть проблематичным, поскольку синглтон должен существовать на протяжении всего жизненного цикла приложения, и этот словарь, вероятно, никогда не будет выпущен. Аналогично, блок, сохраненный в словаре, также должен сохраняться, так что мне интересно, не нужно ли мне беспокоиться о том, чтобы вызывать авто-релиз для них после вызова метода копирования.

Или, может быть, есть другой способ выполнить то, что я хочу, без необходимости прибегать к текущей технике, которая может быть менее проблематичной

Что люди могут предложить по этому вопросу?

2 ответа

Вы должны иметь лучшую удачу, преодолевая +[NSObject initialize] скорее, чем load, initialize вызывается при первом обращении к классу, а не при загрузке изображения, в котором находится класс. Это даст вам лучшую передачу всего этого.

Хороший подход заключается в использовании dispatch_once_t, который выполняется только один раз за время выполнения во всех потоках:

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static SingletonClass *sharedInstance;
    dispatch_once(&once, ^ { sharedInstance = [[self alloc] init]; });
    return sharedInstance;
}
Другие вопросы по тегам