Обычно я использую статические массивы и словари для хранения таблиц поиска в моих классах. Однако из-за того, что число классов быстро увеличивается до сотен, я не решаюсь продолжать использовать этот шаблон. Даже если эти статические коллекции инициализируются лениво, по сути, у меня возникает ограниченная утечка памяти, когда кто-то использует мое приложение.
Большинство из них являются массивами строк, поэтому я могу конвертировать строки в константы NSInteger, которые можно использовать с операторами switch и т. Д.
Я мог бы просто воссоздавать массив / словарь при каждом вызове, но многие из этих функций используются интенсивно и / или в узких циклах.
Итак, я пытаюсь придумать шаблон, который является одновременно и быстродействующим, и непостоянным.
Если я храню информацию в виде списка, делает ли iphoneOS что-то умное с кэшированием при загрузке?
У вас есть другой метод, который может быть связан?
РЕДАКТИРОВАТЬ - ПРИМЕР ОТВЕТА
Основываясь на предложенном ниже решении, вот с чем я буду работать ...
Сначала добавьте метод в NSObject через категорию.
- (void)autoreleaseOnLowMemory;
Теперь, когда я хочу создать статичный массив или словарь с отложенной загрузкой в вспомогательной функции, я могу просто использовать следующий шаблон ...
- (id)someHelperFunction:(id)lookupKey {
static NSDictionary *someLookupDictionary = nil;
if (!someLookupDictionary) {
someLookupDictionary = [[NSDictionary dictionaryWithObjects:X, Y, Z, nil] autoreleaseOnLowMemory];
}
return [someLookupDictionary objectForKey:lookupKey];
}
Теперь вместо того статического словаря, который дожил до конца программы, если у нас не хватит памяти, он будет освобожден и восстановлен только при необходимости снова. И да, в большом проекте, работающем на iphone, это может быть важно!
PS - Реализация autoreleaseOnLowMemory тривиальна. Просто создайте одноэлементный класс с методом, который берет объект и сохраняет его в наборе. Пусть этот синглтон прослушивает предупреждения о нехватке памяти, и, если он его получает, освобождает все объекты в этом наборе. Может также захотеть добавить функцию ручного отключения.