0

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

Благодаря

ответ

0

Чтобы удалить вид из его надтаблицы:

[view removeFromSuperview]; 

SuperView выпустит мнение в этой точке. Поэтому, если супервизор является единственным действующим лицом, обладающим ссылкой, то представление будет освобождено. Иными словами, это:

[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. Он будет освобожден после удаления.

Per нормальных правил ссылочных какао подсчета, следующий в значительной степени так же, как капля в замену на Alloc/инициализации и последующего выпуска:

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... 

Если вы ничего не сделали вручную влияют на поведение, будучи просто в обычном runloop, тогда вещи в пуле авторесурсов безопасны для жизни текущего стека вызовов. В этом случае вы будете обрабатывать представление точно так же, как в примере с ручным распределением/инициализацией, возможно, внеся изменения, чтобы сохранить строку кода и оставить управление памятью неявным.

Смежные вопросы