Чтобы удалить представление из его суперпредставления:
[view removeFromSuperview];
Суперпредставление освободит представление в этой точке.Так что, если суперпредставление является единственным действующим лицом, которому принадлежит ссылка, то представление будет освобождено.Другими словами, это:
[superview addSubview:view];
заставляет суперпредставление сохранять вид.Таким образом, вы часто видите блоки кода, такие как:
view = [[ViewClass alloc] initWithFrame:frame]; // I own view
[superview addSubview:view]; // superview and I both own view
[view release]; // now only superview owns view;
// it'll be deallocated if
// superview ever relinquishes
// ownership
Итак, теперь у вас есть указатель для просмотра, который действителен, пока представление остается в суперпредставлении.Поэтому впоследствии безопасно публиковать removeFromSuperview
, но после этого использование view явно небезопасно.Объект представления будет жить только между alloc / init и removeFromSuperview.Он будет освобожден после удаления.
В соответствии с обычными правилами подсчета ссылок Какао, следующее почти то же самое, что и вставная замена для alloc / init и последующего выпуска:
view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object;
// the autorelease pool owns it
[superview addSubview:view]; // superview now owns view also
// the autorelease pool will relinquish ownership automatically, in the future...
Если вы ничего не сделали вручную, чтобы повлиять на поведение, просто находясь в обычном цикле выполнения, то вещи в пуле автоматического выпуска безопасны для жизни текущего стека вызовов.В этом случае вы бы рассматривали view точно так же, как в примере с alloc / init вручную, возможно, внеся изменения просто для сохранения строки кода и неявного управления памятью.