Выпуск содержимого UIWebView из памяти, заставить приложение освободить память - PullRequest
2 голосов
/ 18 февраля 2012

Я разрабатываю приложение, которое использует много изображений, я использую UIWebView для представления около 200 изображений с использованием кода JavaScript (я использую библиотеку UIZE ), проблема в том, когда я закончу с UIWebView, я использую следующий код в viewWillDisappear

-(void)viewWillDisappear:(BOOL)animated {
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    [webViews stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
}

с

- (void)viewDidUnload
{
    webViews = nil;
}
- (void)dealloc {
    [webViews release];
}

Но зарезервированная память, извлеченная из UIWebView, все еще находится в памяти, поэтому мой первый вопрос: как заставить приложение освободить память, извлеченную из UIWebView?

Та же проблема возникает с UIImageView, я использую большое изображение (около 3072 * 2024), которое будет извлекать (3072 *2024* 3 = 18 МБ) из памяти, я загружаю около 8 изображений, как что зарезервированная память огромна, и когда я пытаюсь освободить их, происходит то же самое, зарезервированная память, взятая из каждого изображения, остается в памяти (я всегда получаю предупреждение, которое говорит Low Memory warning). Мне удалось загрузить около 2 изображений такого размера, чтобы уменьшить зарезервированную память, но память не освобождает память до тех пор, пока не появится предупреждение о нехватке памяти. Итак, как я могу уменьшить и справиться с огромным количеством изображений и освободите зарезервированную память в экземпляре!?

Примечание:

Я использовал взломанную версию для [UIImage imageNamed:]; метода следующим образом:

@implementation UIImage(imageNamed_Hack)

+ (UIImage *)imageNamed:(NSString *)name {
return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], name ] ];
}
@end

Любая помощь будет оценена.

Спасибо заранее.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Есть много дел, прежде чем вы отпустите и установите ноль.

Удалить все кэшированные ответы HTTP:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

Или даже установить модель кэша WebKit:

[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];

Установите фон в любой цвет, чтобы WebKit очистил кешированную память дисплея:

[webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"];

Затем закройте документ:

[webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close()"];
4 голосов
/ 23 февраля 2012

Попробуйте это:

- (void)viewDidUnload
{
[webViews release];
webViews = nil;
}

Очень важно выпустить, прежде чем вы установите его на ноль. Установка переменной в ноль не означает, что она освобождена. Вы устанавливаете его указатель на ноль, но память, на которую он указывал ранее, останется там и вызовет утечку. Это главная проблема.

С изображениями вы можете сделать следующее: Не используйте UIImageView в этих случаях, я бы предложил использовать CATiledLayer и визуализировать изображения непосредственно на нем.
Вот ссылка на класс: CATiledLayer
У него есть два примера приложений. Я думаю, что вы должны проверить приложение PhotoScroller, созданное Apple, оно может дать вам представление о том, как вы можете решить вашу проблему. Основная идея состоит в том, чтобы визуализировать изображение в виде плиток, поэтому будут отображаться только те части изображений, которые в данный момент находятся на экране, это экономит много памяти, поскольку не будет отображаться вне частей экрана.

...