Перемещает ли представление к новому суперпредставлению автоматически его старое суперпредставление? - PullRequest
3 голосов
/ 15 июля 2009

В любом случае, для меня неясно, будет ли UIView автоматически освобожден из его суперпредставления, если вы используете addSubview для добавления его в другое представление?!? Я знаю, что представление может иметь только ОДИН суперпредставление, но мне не совсем ясно, как именно перемещать подпредставление из одного суперпредставления в другое.

сохранить представление, выпуск (из старого суперпредставления), addSubview к новому суперпредставлению

или

просто добавить Sububview к новому суперпредставлению?

Ответы [ 3 ]

4 голосов
/ 15 июля 2009

На вопрос о том, освобождается ли представление при вызове -removeFromSuperView, это так, и это задокументировано в справке UIView под -removeFromSuperView. Не так явно указано, что -addSubView: вызывает -removeFromSuperView, но это подразумевается и может быть проверено путем перегрузки -removeFromSuperView в подклассе UIView.

Поэтому я не могу думать о причине, чтобы звонить -removeFromSuperView в этом случае. Нет никаких оснований для управления памятью, так что это добавляет сложности кода (и, следовательно, потенциальных ошибок) для небольшого значения. Даже в тех случаях, когда я хотел подчеркнуть более поздним разработчикам, что это представление меняет иерархию представления, я бы использовал здесь комментарий, а не дополнительное сохранение / публикацию здесь.

2 голосов
/ 15 июля 2009

Чтобы быть в безопасности, поместите удержание в представление, прежде чем перемещать его следующим образом:

[[theView retain] autorelease];
[theView removeFromSuperview];
[newSuperview addSubview:theView];

Если суперпредставление является единственным объектом, который удерживается в подпредставлении, тогда подпредставление будет освобождено, когда оно будет удалено из суперпредставления. Retain и autorelease гарантируют, что представление не будет освобождено, пока вы используете его в функции (потому что на нем есть дополнительное сохранение).

2 голосов
/ 15 июля 2009

Добавление представления к суперпредставлению сохраняет это представление, удаление представления из суперпредставления освобождает его.

[subview retain]; // because next line will release
[subview removeFromSuperView]; // released by superview
[otherSupView addSubview:subview]; // retained by new superview
[subview release]; // because you retained it in line 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...