У меня есть приложение, которое во многих отношениях очень похоже на ваше (использует Three20, имеет несколько вкладок в нижней части, каждая вкладка может иметь таблицу, каждая ячейка может иметь одно или два изображения);и подход, который я использую, - тот, который вы упомянули ближе к концу вашего поста:
Средний подход - освободить NSMutableDictionary для изображений при получении предупреждения о нехватке памяти.
Лично мне очень нравится подход iOS к управлению памятью, предупреждающий меня, когда память становится тесной.Подход Mac / PC «просто используйте всю нужную память, мы выгрузим ее на диск, если объем памяти будет ограничен», имеет недостаток, заключающийся в том, что, хотя ОС является единственной, кто действительно знает, какое давление на память, это не говорит вам.Я думаю, что каждое вежливое приложение действительно хотело бы сказать (если бы приложения могли говорить): «Я был бы рад использовать столько памяти, сколько вы мне дадите, но я не хочу беспокоиться, я неЯ не хочу замедлять работу других приложений, поэтому, если вы могли бы дать мне подсказку о том, сколько памяти я могу использовать, не вызывая проблем, я был бы признателен. "
Хорошо, это то, что дают предупреждения о памяти в iOS.Вы, по моему мнению.Поэтому храните в памяти столько изображений, сколько хотите;и когда вы получите предупреждение о памяти, очистите кэш в памяти.Для меня это действительно лучшее из обоих миров.
Кроме того, вам определенно стоит взглянуть на Three20's TTURLCache
, хотя я не могу вам много рассказать об этом, потому что я не очень углубился в это.много.Что я знаю, так это:
- Если вы извлекаете свои сообщения с помощью
TTURLImageResponse
, они автоматически кэшируют их в кэше изображений TTURLCache
. - Вы также можете сохранять изагрузите ваши собственные изображения (и другие данные) в
TTURLCache
.
Three20, похоже, использует подход, аналогичный тому, о котором я говорю.Взгляните на этот код из Three20Network / Sources / TTURLCache.m (аргумент NO
означает не удалять с диска, а только удалять из памяти):
- (void)didReceiveMemoryWarning:(void*)object {
// Empty the memory cache when memory is low
[self removeAll:NO];
}
Кроме того, этот класс также позволяетзадать максимальный размер кэша в памяти, но по умолчанию максимальный размер отсутствует.