50 просмотров, как вы описываете, звучит как большой боров памяти. Поэтому я подозреваю, что управление памятью выгружает некоторые представления. Затем, когда вашей программе нужны представления, их там нет, и ваша программа падает. Сообщение об ошибке не совсем подходит для этого, но, возможно, оно не совсем точно говорит вам, в чем проблема.
Рассмотрите следующий возможный сценарий и посмотрите, соответствует ли он тому, как вы кодировали эту программу.
Чтобы ОС могла управлять памятью, она может выгружать представления и перезагружать их по мере необходимости. Когда это сделано, вызываются методы viewDidUnload, loadView и viewDidLoad.
viewDidUnload:
Этот метод вызывается как аналог метода viewDidLoad. Он вызывается в условиях нехватки памяти, когда контроллеру представления необходимо освободить свое представление и любые объекты, связанные с этим представлением, чтобы освободить память. Поскольку контроллеры представлений часто хранят ссылки на представления и другие связанные с представлением объекты, вы должны использовать этот метод, чтобы отказаться от владения этими объектами, чтобы можно было восстановить память для них. Вы должны делать это только для объектов, которые вы можете легко восстановить позже, либо в вашем методе viewDidLoad, либо из других частей вашего приложения. Вы не должны использовать этот метод для публикации пользовательских данных или любой другой информации, которая не может быть легко воссоздана.
loadView:
Контроллер представления вызывает этот метод, когда запрашивается свойство представления, но в данный момент оно равно nil. Если вы создаете свои представления вручную, вы должны переопределить этот метод и использовать его для создания ваших представлений. Если вы используете Interface Builder для создания ваших представлений и инициализации контроллера представления, то есть вы инициализируете представление с помощью initWithNibName: bundle: метод, устанавливаете свойства nibName и nibBundle напрямую или создаете оба представления и контроллер представления в Interface Builder. тогда вы не должны переопределять этот метод.
Проверьте ссылку на класс UIView -
viewDidLoad:
Этот метод вызывается после того, как контроллер представления загрузил связанные виды в память. Этот метод вызывается независимо от того, были ли представления сохранены в файле пера или созданы программно в методе loadView. Этот метод чаще всего используется для выполнения дополнительных шагов инициализации для представлений, загружаемых из файлов пера.
Возможно, вы непреднамеренно инициализировали эти представления в ваших методах init, а не в ваших методах loadView. Если вы это сделали, то когда ОС выгрузит представление (вы увидите, что вызывается viewDidUnload), память, связанная с представлением, и все подпредставления (все изображения и анимации) будут выгружены. Это экономит память, но когда вам нужно, чтобы одно из этих незагруженных представлений появилось снова, сначала будет вызван loadView, если представление было ранее выгружено. Если настройка вашего представления выполняется в методах init, а не в loadView, то представление снова не будет настроено. Но если настройка представления выполняется в методе loadView, его можно восстановить после того, как управление памятью выгружает его.