Выпуск подвидов - PullRequest
       7

Выпуск подвидов

0 голосов
/ 01 декабря 2010

Я довольно новичок в программировании для iOS, и у меня возникла проблема с разрабатываемым приложением для iPad.Я использую контроллер splitview для добавления подпредставления к подробному представлению splitview при каждом нажатии на ячейку в корневом представлении splitviewЭто нормально, пока стек не станет слишком высоким, и у меня не хватит памяти.Как я могу освободить предыдущее подпредставление после добавления нового представления в стек?Или есть лучший способ решения этой проблемы?

Спасибо

1 Ответ

0 голосов
/ 01 декабря 2010

Чтобы удалить представление из его суперпредставления:

[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 вручную, возможно, внеся изменения просто для сохранения строки кода и неявного управления памятью.

...