Использование [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;
}