Подходящий способ удалить / освободить UIView после removeFromSuperview - PullRequest
0 голосов
/ 28 октября 2011

Я играю с рисованием в приложениях iOS. У меня есть класс, который является подклассом UIView, который рисует некоторые линии и прочее. Когда пользователь нажимает кнопку, я создаю экземпляр класса и делаю addSubView в представлении основного UIViewController приложения. Чем больше раз пользователь нажимает эту кнопку, тем больше экземпляров этого класса добавляется в представление. Работает просто отлично.

Теперь я хочу предоставить пользователю способ удалить одно из этих представлений. До сих пор я поместил [self removeViewFromSuperview] в метод touchesBegan пользовательского UIView. Поэтому, когда пользователь нажимает на рисунок, он удаляется из вида. Но это на самом деле не удалено, верно? Поскольку представление было создано в методе, который выполняется при нажатии кнопки, я не могу ссылаться на него из UIViewController. Как правильно убедиться, что я не трачу память на UIView, который был создан и удален?

В соответствующей заметке, если бы я поставил тумблер на UIView главного окна, который переключает удаление, как я могу проверить изнутри touchesBegan, если этот тумблер установлен на delete = yes? Будет ли в AppDelegate какая-то логическая переменная, которую я могу проверить из подкласса UIView? Как бы я сослался на это?

Спасибо за помощь,
* Stateful * 1018

Ответы [ 4 ]

4 голосов
/ 28 октября 2011

Если добавить вид, подобный этому:

UIView *viewBeingAdded = [[[UIView alloc] init] autorelease];
[view addSubview:viewBeingAdded];

Вы можете удалить его без утечки памяти:

[theViewAboutToBeRemoved removeFromSuperview];

Что касается UISwitch, вам не нужно хранить его значение где-либо, если оно не нужно для чего-то другого. Вы можете получить доступ к его значению напрямую:

if ([theSwitch isOn]) { ... }

Вам даже не нужен IBOutlet, вы можете получить доступ к коммутатору с помощью его тега:

UISwitch *theSwitch = (UISwitch *)[view viewWithTag:<# switch tag number #>];
if ([theSwitch isOn]) { ... }

В этом случае вы должны установить уникальный номер тега для коммутатора в Интерфейсном Разработчике или при его создании.

0 голосов
/ 28 октября 2011

Если вы создаете UIView с помощью alloc/init, добавляете его в суперпредставление, затем освобождаете представление, суперпредставление сохранит его.Когда он удаляется с помощью removeViewFromSuperview, он будет освобожден.

0 голосов
/ 28 октября 2011

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

Что касается проверки переключателя, вы можете добавить IBOutlet, чтобы вы могли проверить его напрямую.(Это может быть не просто MVC, но я не знаю, если поместить его в [UIApplication sharedApplication] .delegate обязательно чище.)

0 голосов
/ 28 октября 2011

Когда вы делаете [mainView addSubView: myView], mainView сохраняет myView.Если вы создали myView с помощью alloc / init, то вы также сохранили его.Если вам не нужен myView после добавления его в главное представление, просто сделайте [myView release] после добавления.Когда вы удалите его из основного вида, он будет освобожден и освобожден.

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