Как «выпустить» UIWebView на ARC - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь разработать действительно простой браузер, чтобы стать частью приложения для iPad.Этот браузер будет иметь вкладки.Все вкладки основаны на .xib с UIWebView, заполняющим почти весь кадр .xib.Я храню их все в NSMutableArray, называемом tabsArray.

. Итак, вот как я добавляю новую вкладку в массив: объявление:

.h

@property (nonatomic,strong) NSMutableArray *tabsArray;
@property (nonatomic,strong) UIDetailWebController *pagina;

.m

self.pagina = [[UIDetailWebController alloc] initWithNibName:@"UIDetailWebController" bundle:nil];
[tabsArray insertObject:pagina atIndex:currentViewTag+1];

как я отображаю это на экране:

[self.view addSubview:[[tabsArray objectAtIndex:currentViewTag+1] view]];

И, наконец, вот как я пытаюсь «освободить» UIWebView, когда пользователь закрываетВкладка (с определенным индексом):

[[[tabsArray objectAtIndex:index] view] removeFromSuperview];
[[tabsArray objectAtIndex:index] setWebView:nil];
[[tabsArray objectAtIndex:index] setView:nil];
[tabsArray removeObjectAtIndex:index];

Моя проблема в том, что, делая это, я просто не выпускаю ее.Потребление памяти остается прежним, и если я играю видео на YouTube, звук продолжает воспроизводиться.Я немного новичок в программировании и начал разработку iOS под iOS 5 с ARC, так что, возможно, я позволю себе немного подробнее рассказать об управлении памятью.

РЕШЕНИЕ:

Хорошо, я обнаружил, что сохранение веб-просмотра было реализацией PullToRefreshView (https://github.com/chpwn/PullToRefreshView). Когда я устанавливаю его делегат на ноль; все просто работает!

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Мне кажется, проблема в том, что вы храните все ваши UIDetailWebControllers в массиве. Массив хранит сильный указатель на ваш DetailWebController. Вы должны использовать:

[tabsArray removeObjectAtIndex:index];

А затем установите

self.pagina = nil;

После вызова [self.pagina removeFromSuperView]; должно заработать.

2 голосов
/ 19 марта 2012

Свойство pagina является сильным свойством, поэтому оно сохраняет значение, назначенное ему в:

self.pagina = [[UIDetailWebController alloc] initWithNibName:@"UIDetailWebController" bundle:nil];

Таким образом, вам следует установить значение nil:

[tabsArray removeObjectAtIndex:index];
self.pagina = nil; // Add this line.

Наконец, не то, чтобы следующие строки не требовались:

[[tabsArray objectAtIndex:index] setWebView:nil];
[[tabsArray objectAtIndex:index] setView:nil];

И что строку:

[[[tabsArray objectAtIndex:index] view] removeFromSuperview];

можно упростить до:

[self.pagina removeFromSuperview];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...