2010-11-24 3 views
0

Извинения за большой текст «o», но я начинаю играть, используя UINavigationController как часть приложения, которое я пишу, Мне просто интересно, как я должен обрабатывать добавление контроллеров представлений в UINavigationController, и когда (если когда-либо) я должен их освободить.UINavigationController - Когда выпустить толкаемые контроллеры просмотра и т. Д.

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

  1. Есть переменная экземпляра для каждого контроллера представления в классе управляющего. Инициализируйте его (если переменная экземпляра равна нулю), прежде чем нажимать его на контроллер nav. Затем выпустите контроллер представления в методе dealloc управляющего класса, если он не равен нулю.

  2. Создайте контроллер вида в виде локальной переменной внутри метода и нажмите его на контроллер навигации, прежде чем немедленно его освободить.

Однако я не уверен в действительности каждого из них. (Моя внутренняя чувствительность заключается в том, чтобы идти с подходом с переменным экземпляром, но, возможно, это связано с отсутствием понимания с моей стороны.)

Копаем немного глубже, я подозреваю, что мое замешательство связано с тем, я не понимаю, отвечаю ли я за то, что я распоряжаюсь контроллерами представлений, которые выталкиваются в стек контроллера диспетчера, или же он сам будет их уничтожать, когда они выскочат из стека контроллера представления. (например: когда пользователь нажимает кнопку «назад».)

Если это первый, то я вижу, что мне нужно будет использовать подход переменной экземпляра и реализовать методы UINavigationControllerDelegate в объекте управления, чтобы определить, когда Я должен освободить и проигнорировать каждый контроллер вида и т. Д.

Наконец (для бонусных точек в загробной жизни), как вы можете легко определить, будет ли метод увеличивать счетчик удержания одного из его параметров? (Там, кажется, не будет каких-либо подсказки в документации, но, возможно, я что-то очевидное отсутствует). Например, когда я использую что-то вдоль линий ...

[[self navigationController] pushViewController:exampleVC animated:YES]; 

... это будет увеличить количество удержаний на контроллере представления? (Еще раз, моя кишка чувствует, что она должна, но это примерно так же полезно, как шоколадная пожарная охрана в эти опасные времена и т. Д.)

Заранее спасибо.

ответ

1

Это довольно просто. Если вы передадите объект другому объекту, который что-то делает с ним, который не находится под вашим прямым контролем, он сохраняет объект, который вы проходите (почти все работает так).

Например: все NSArray/Dictionary/Set Collections сохраняют ваши объекты, потому что если вы освободите объект, содержащийся в такой записи, некоторые записи будут недействительными, и коллекция не будет знать.

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

+0

Спасибо за эвристику - я никогда не думал об этом в этих терминах. – 2010-11-24 11:18:42

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