2012-06-05 2 views
0

Я сделал универсальное приложение, которое содержит файлы NIB для ipad и iphone UI. По моему мнению, метод initWithNibName контроллера вызывает UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM(), чтобы определить, работает ли контроллер на iphone или ipad.Приложение Xcode работает на Iphone, но сбой на Ipad

Затем я запускаю их соответствующие файлы nib. Когда я запускаю приложение на iphone, он работает нормально, но когда я запускаю его на ipad, он в конце концов сбой с ошибкой EXC_BAD_ACCESS. Эта ошибка возникает, когда я использую контроллер вида для запуска другого контроллера представления, который затем запускает другой в стеке навигации. Эта ошибка возникает, как только я нажимаю вид, принадлежащий третьему контроллеру стека.

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

Любые советы о том, как подходить к решению этой проблемы, были бы очень благодарны.

+0

Это происходит как на устройстве, так и на симуляторе? Если вы по-прежнему не получаете полезной информации после включения этих «всех исключений», упомянутых ниже, переходите к трюкам NSLog() с [описанием объекта], пока не найдете нулевое значение. –

ответ

2

Первое, что вам нужно сделать, это включить точку останова «Все исключения». Это часто будет точно указывать строку кода, где происходит EXC_BAD_ACCESS.

enter image description here

Далее, я бы включить зомби и увидеть, где более-релиз происходит. Для этого в Xcode, удерживая ключ опции, нажмите «Продукт | Запустите. В следующем окне добавьте NSZombieEnabled в список переменных среды.

enter image description here

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

Когда вы получаете EXC_BAD_ACCESS, это означает, что вы пытаетесь получить/освободить то, что уже выпущено. Если вы находитесь в ситуации, отличной от ARC, это обычно означает, что вы случайно выпустили что-то, когда вы этого не хотели, поэтому просто проверьте баланс alloc/init и release. Если, однако, вы находитесь в ситуации с ARC, я бы поспорил, что это связано с тем, что не уничтожайте делегата, когда контроллер просмотра будет выпущен.

Например, если у вас есть MKMapView и установите его делегат на контроллер представления, вы должны удалить его делегат, когда ваше представление будет выгружено или отменено. В противном случае сообщения будут по-прежнему настроены на него. Или, еще одна возможность заключается в том, что вы добавили свой контроллер представлений в качестве наблюдателя NSNotificationCenter и не удалили его как наблюдателя, когда контроллер просмотра был выгружен или отключен.

Другая возможность заключается в том, что вы повторно используете контроллеры представлений между двумя версиями вашего универсального приложения. Если вы получаете доступ к чему-либо по идентификатору, который не существует в nib для iPad, это может привести к сбою - хотя, если вы используете nibs в отличие от раскадровки, это может и не быть проблемой.

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

С уважением.

+0

Большое спасибо, очень полезный ответ.Я наконец-то понял. Приветствия. – Andrew

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