2011-07-31 2 views
0
navigationController = [[[UINavigationController alloc] initWithRootViewController:firstMenuView] autorelease]; 
[view addSubview:navigationController.view]; 

Поддерживает ли просмотр на навигационном контроллере? Или мне нужно сохранить его?будет ли мой uinavigationcontroller сохранен или он будет выпущен

Вызывает ли вызов navcontroller.view removefromparent фактический выпуск контроллера nav?

ответ

2

Контроллер является owner той точки зрения, вид будет держать слабую ссылку (не-retain ЭД) в контроллер, контроллер будет держать сильный (ED) retain ссылкой на вид. В этом случае ваш navigationController был автореализован, поэтому теоретически он должен быть освобожден, пока никто не будет указан.

С навигационной точки зрения вид с другой стороны был добавлен как подзаголовок в другой, что означает, что он сохраняется в виде родительского представления. Это проблема, потому что если в представлении есть какие-либо вызовы контроллеру, эти вызовы перейдут на освобожденный объект. 99% времени вы получаете EXC_BAD_ACCESS для этого, и ваше приложение падает. Остальные 1% намного хуже.

К счастью, все, что вам нужно сделать, чтобы предотвратить вышеупомянутые катастрофы, - это найти что-то, чтобы «владеть» вашим навигационным контроллером, дать ему @property (сохранить) и назначить для этого навигационный контроллер. (Держите авторекламу, эта часть хороша) Хорошими кандидатами на владение вашим контроллером навигации являются контроллер представления родительского представления и делегат приложения.

Таким образом, контроллер будет придерживаться столько, сколько потребуется, потому что он будет сохранен хотя бы один раз.

Здесь важно различать контроллер и вид. Объект представления сохраняется, объект контроллера выделяется затем автоматически, поэтому он ушел, если вы его не сохранили.

1

addSubview: сохраняет navigationController.view. Удаление его из родителя releases. Так как вы его автореализовываете, вам не нужно сохранять его или отпускать, он будет обработан для вас.

+1

кроме s/he автореализован – Colin

+0

Отредактировано - спасибо. –

0

Нет, контроллер вида не освобождается, поскольку вид контроллера представления является свойством контроллера вида. Представление контроллера просмотра не является тем же объектом, что и контроллер вида. Вы не добавляете контроллер вида в родительское представление.

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