сколько раз мне нужно загрузить перо? - PullRequest
1 голос
/ 04 июня 2010

Не уверен, что это глупый вопрос, но сколько раз мне нужно загружать какой-либо конкретный кончик?

Насколько я понимаю, вы фактически разархивируете перо, когда загружаете его, поэтому он доступен в любое время для инициализации?

Пример:

controlsViewController *controls = [[controlsViewController alloc] initWithNibName:@"controlsViewController" bundle:nil];
[self addSubview:controls.view];

Затем, позже я выпускаю этот view-контроллер:

[controls release];

В следующий раз, когда я захотел инициализировать этот тип viewcontroller, я использую перо или просто "init ??

Ответы [ 3 ]

1 голос
/ 05 июня 2010

Spadict, здесь есть несколько вещей не так. Во-первых, я забочусь о банальных придирках меньше, чем большинство людей, но это помогает понять язык правильно. На самом деле это так. Пойдем медленно ..

Если у вас есть класс ControlsViewController (обратите внимание на верхний регистр C), вы можете использовать его в любое время. Вы можете создать столько экземпляров , сколько захотите. Чтение документации для UIViewController (я предполагаю, что ControlsViewController - это класс, который вы написали, и что это подкласс UIViewController) говорит нам, что назначенный инициализатор - -initWithNibName: bundle: . Это означает, что обычно мы будем использовать это так: -

ControlsViewController *controls = [[ControlsViewController alloc] initWithNibName:@"aNib" bundle:nil];

Другой способ создания экземпляра класса - использование Interface Builder. В Интерфейсном Разработчике вы можете создать столько экземпляров любого Класса, сколько захотите, настроить их свойства, а затем сохранить их как есть, настроенные так, как вам нравится, в файл пера. Это хороший способ создания экземпляров графического интерфейса пользователя, окон, кнопок, представлений и т. Д., Поскольку вы можете визуально манипулировать позициями и размерами, а также можете добавить кнопку к представлению или представление к окну, перетаскивая его мышью - что проще, чем кодирование.

Файл .nib сопоставим с файлом .zip. Нас не волнует файл .nib, нам важны экземпляры объектов, которые мы заархивировали внутри него. Мы не разархивируем файл .nib, мы разархивируем объекты, которые мы создали с помощью Interface Builder и затем заархивировали как файл nib.

Каждый раз, когда мы загружаем файл пера, мы воссоздаем объекты внутри него, какими они были при сохранении пера. В качестве примера: - в Интерфейсном Разработчике я создаю Окно и устанавливаю его цвет фона на черный, а его ширина - 600 пикселей. Я сохраняю его в наконечнике (в этом наконечнике есть один оконный объект, но нет ограничений на количество объектов или тип).

Когда я запускаю приложение, я загружаю .nib 5 раз. Теперь у меня есть 5 окон с черным фоном шириной 600 пикселей.

Назначенный инициализатор UIViewController принимает имя пера в качестве первого аргумента. Когда мы создаем экземпляр UIViewController, он вызывает '-loadView', чтобы загрузить перо, которое мы передаем, разархивируя объекты внутри. Вам никогда не нужно вызывать '-loadview', и использование пера никоим образом не является альтернативой этому методу.

Таким образом, представление может быть создано программно или с помощью Interface Builder, а затем загружено из пера. Ни один из них "не включает в себя рисование вида программно". Если у вас есть вид, вы можете сказать ему рисовать, и вы можете делать это 50 раз в секунду, или вы можете делать это один раз, но это отдельная операция.

1 голос
/ 04 июня 2010

Я думаю, я понял это, поэтому я попытаюсь ответить на свой вопрос.

Вам нужно загружать перо каждый раз, когда вы инициализируете контроллер представления, который хочет его использовать.Загрузка пера является альтернативой методу loadView от UIViewController, который включает в себя прорисовку вида программно.

Перо не является классом объекта и не является чем-то инициализированным в памяти, как NSObject.Это просто заархивированная альтернатива программной загрузке представления, и его нужно загружать каждый раз, когда вы хотите использовать его с контроллером представления.

Кто-нибудь может подтвердить или опровергнуть?

0 голосов
/ 05 июня 2010

Файл Nib - это просто набор объектов пользовательского интерфейса, которые были сериализованы. Когда вы делаете [controller initWithNibName:@"file"] объекты перестраиваются в память из файла. Владелец файла из Interface Builder является заменой для объекта controller, которому отправляется сообщение initWithNibName:. Поэтому любые подключения, которые вы установили из Владельца файла к представлению в Интерфейсном конструкторе, связаны с объектом controller при загрузке пера. По крайней мере, это, вероятно, будет свойство view UIViewController.

Результат всего этого - когда вы делаете [controller release], объект controller также освобождает все свои ссылки, включая те объекты, которые были загружены из пера. Так что да, вам нужно будет перезагрузить перо, потому что все эти объекты были освобождены.

Слово предупреждения. Я вижу, вы делаете [self addSubview:controls.view]. Если вы не делаете что-то вроде [controller.view removeFromSuperview] до того, как отпустите контроллер, то базовое представление все еще содержит ссылки на все. (По крайней мере, я думаю, что это правда.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...