2015-09-02 4 views
1

Я довольно новичок в Objective-C и iOS, и я взял приложение, написанное кем-то еще. Я заметил что-то, что меня бросило, и я думаю, что мой вопрос немного отличается от других вопросов, которые люди задавали о addChildViewController.Чтобы вызвать addChildViewController или не вызвать addChildViewController

Ну, приложение работает нормально. Вращения работают нормально. Все хорошо. Так в чем проблема?

Хорошо, есть полноэкранный режим, который содержит кучу надстроек в бок о бок плиточный тип макета. Другими словами, все они имеют одинаковое полноэкранное родительское представление, и каждый из них является родным братом. Эти подзоны представляют собой экземпляр UIViewController. я ожидал увидеть эти подвидов настроенные, как это ...

, но вместо этого они просто делают это ....

DoohickeyController *doohickey = [[DoohickeyController alloc] initWithNibName:@"Doohickey" bundle:nil]; 
[self.view addSubview:doohickey.view]; 

Есть жесткое правило о том или нет позвонить addChildViewController, когда приложение работает нормально?

Есть ли какие-либо преимущества/недостатки для добавления звонка в addChildViewController?

ответ

3

Одним из основных допущений по проекту в UIKit является то, что иерархия ViewController будет, как правило, синхронизироваться с иерархией View. Обратные вызовы, связанные с обработкой авторотации и переходами класса размера, передаются по цепочке ViewController, и если вы никогда не создаете отношения между родителями и дочерними объектами между ViewController, эта система распадается.

Я следую за образец (psudo кода)

//given: 
ViewController *a; 
ViewController *b; 

[a willMoveToViewController:b]; 
[b addChildViewController:a]; 
[a didMoveToViewController:b]; 

[b.view addSubview:a.view]; 
+0

Хотя я бы с этим согласился, приложение работает отлично без вызова 'addChildViewController' более года, что заставляет меня полагать, что вызов действительно не нужен в некоторых случаях, я просто не делаю знать, что это за дела. –

+1

Это было бы заметно в ситуациях, когда вид просмотра детского viewcontroller должен быть перерисован после поворота устройства. Он никогда не слышит о событии вращения и, следовательно, никогда не перерисовывает себя. – Nick

+0

Хорошо. Я собираюсь попробовать некоторые сценарии отладки и посмотреть, могу ли я сказать, что происходит. Кроме того, SugaR сделал в своем ответе более интересный момент, который мне также нужно исследовать, потому что мой диспетчер представлений должен идти ноль, но что-то держит его, сохраняя его, хотя это локальная переменная, и я не добавляя его в качестве дочернего контроллера. –

2

Я думаю, что одна из причин может быть собственностью вашего childViewController.

Если у вас alloc init это функция, это автоматический параметр внутри этой функции. И когда функция вернется, ваш childViewController будет автоматически освобожден и станет nil.

Между тем, вид (doohickey.view) вашего childViewController, из-за вас addSubview к self.view, поэтому он будет храниться self (ViewController). Вид все еще существует, несмотря на то, что его VC уже nil.

Так addChildViewController пусть self (ViewController) держать doohickey (subviewController), поэтому право собственности на doohickey и doohickey.view будет объединена, и будет выпущена в то же время (после self освобождения).

+0

То есть интересная мысль о «Alloc» INIT и на самом деле возникает еще один вопрос. Да, распределение по сути является автоматическим параметром, как вы предполагали, однако кажется, что он НЕ исчезает после завершения функции, потому что каким-то образом код в классе 'alloc init'ed все еще выполняется позже в приложении ... который не должно происходить, если на самом деле пропало. Я собираюсь исследовать, что может там происходить. Интересный момент. –

+0

@ user3055655 Это не имеет смысла. В моем случае я добавляю childViewController для управления моим табличным просмотром.Если я не добавлю '' addChildViewController'' '' self'', делегаты tableView не будут вызываться. Может быть, вы сохраняете childViewController с другого места? – Sugar

+0

Я собираюсь попытаться разобраться в отладочной сессии. Может быть, взгляд держит слабую ссылку на нее и как-то удерживает ее в памяти? Не знаю. Действительно хороший вопрос. –

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