Я использовал бы небезопасный код и работал бы for
цикл, сравнивающий указатели Int32.
, Возможно, необходимо также полагать, что проверка массивов является непустой.
Странно. Я не видел этого конкретного случая, но в целом вы должны предположить, что viewDidLoad можно вызывать несколько раз. Он будет вызываться всякий раз, когда загружается файл пера, который ссылается на этот контроллер.
Для простого приложения с одним пером этого не должно происходить. Но в более сложном приложении, которое может загружать и выгружать контроллеры представлений, это происходит постоянно.
Нельзя предполагать, что viewDidLoad будет вызываться только один раз. Если вы инициализируете объекты и хотите получить гарантию, выполните инициализацию либо в методе инициализации, либо при загрузке из файла пера из метода awakeFromNib.
Лично я бы пошел с:
do
{
cout << "Were you admitted? [y/n]" << endl;
cin >> type;
}
while( !cin.fail() && type!='y' && type!='n' );
-121--3034782- Firefinder отлично подходит для тестирования селекторов. Однако если вы также хотите получить селектор CSS для элемента, попробуйте Gadget .
-121--1086946- Я выполнил отладку, и вот что я обнаружил о порядке загрузки ViewController
:
initWithNibName:bundle: self = <original instance>, retainedOutlet = 0x0
loadView >>> self = <original instance>, retainedOutlet = 0x0
initWithCoder: self = <coder instance>, retainedOutlet = 0x0
initWithCoder: self = <coder instance>, retainedOutlet = 0x0
setView: self = <original instance>, retainedOutlet = 0x0
setRetainedOutlet: self = <original instance>, retainedOutlet = 0x1613c40
viewDidLoad self = <coder instance>, retainedOutlet = 0x0
awakeFromNib self = <coder instance>, retainedOutlet = 0x0
loadView <<<
viewDidLoad self = <original instance>, retainedOutlet = 0x1613c40
viewWillAppear: self = <original instance>, retainedOutlet = 0x1613c40
dealloc self = <coder instance>, retainedOutlet = 0x0
viewDidAppear: self = <original instance>, retainedOutlet = 0x1613c40
Во время метода loadView вызывается initWeyCoder:
и создается новая копия viewController
. это то, что передается в несколько методов (например, viewDidLoad
). копия будет уничтожена позже при вызове dealloc. Хорошая новость в том, что в этой копии сохраненные розетки не настроены, поэтому вы можете использовать это как тест, чтобы знать, следует ли инициализировать переменные, вызывать другие методы и, что самое главное, следует ли выпускать и уничтожать объекты во время dealloc.
Выбор ключа: для реального viewController
будут сконфигурированы сохраненные свойства IBOutlet
. если вы находитесь в переопределенном методе, который вызывается несколько раз, просто проверьте одно из сохраненных свойств IBOutlet
для NULL
. если они имеют значение NULL
, то немедленно возвращайте.
Кто-либо получил какие-либо подсказки относительно того, почему это происходит в этом пути?
Побочный эффект от этого: вы не можете использовать awakeStartNib
надежно.
У меня была аналогичная проблема, и она была результатом переименования моего файла XIB и его класса ViewController
(владелец файла). Не делайте этого - так как на самом деле представления и делегаты неправильно определены внутри XML, и это не подлежит восстановлению. Между тем, у меня была ссылка на загрузку оригинального VC, который должен был стать моим новым VC. Я считаю, что это заставило родителя воссоздать себя, а затем VC, который я действительно пытался вызвать.По сути, я создал непрямую рекурсию для VC, которая имеет записи x2 viewDidLoad
в моей трассировке.
Я не думаю, что есть веская причина для x2 viewDidLoad
, так как это генезис и может вызывать другую инициализацию с неверными предполагаемыми предварительными условиями. Каждый раз, когда я видел x2 viewDidLoad, это была ошибка с моей стороны - довольно часто, когда я проводил рефакторинг и перемещал классы VC.
Если есть веская причина для более чем на viewDidLoad
звонка, пожалуйста, кто-нибудь (Apple Dev, вы слушаете) объясните это в технических деталях - я искал этот ответ уже несколько месяцев.