Ошибка SIGABRT при работе на iPad - PullRequest
1 голос
/ 27 апреля 2010

все. Я несколько часов билась головой из-за этой проблемы. У меня есть универсальный проект, который представляет собой смесь проектов iPhone и iPad. Я собрал эти кодовые базы в универсальный проект и после многих проверок «#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200» заставил проект работать как на симуляторах iPhone (OS 3.0 до 3.1.3), так и на iPad. После более тщательного изучения настроек проекта внешних библиотек, которые я загружаю, я загрузил приложение на iPhone (на котором установлена ​​ОС 3.1.3).

Однако, когда я запускаю приложение на своем iPad, я сразу же получаю ошибку SIGABRT. Я попытался запустить его под Debug , под Release , с Active Architecture как armv6, так и armv7. Я проверил и дважды проверил, что приложение настроило правильные файлы пера (но, опять же, это приложение прекрасно работает в симуляторе). Я просмотрел внешние библиотеки, которые я использую, и настроил их на тот же базовый SDK (3.2), те же архитектуры (оптимизированный (armv6 armv7)), тот же целевое семейство устройств (iPhone / iPad) и та же цель развертывания iPhone OS (iPhone OS 3.0).

Итак, подведем итог ... У меня есть универсальное приложение, которое работает в симуляторе для iPhone и iPad, работает на реальном iPhone, но не работает на iPad. На iPad это далеко не зашло - есть немедленная ошибка SIGABRT, которая останавливает выполнение. Помощь ??

Редактировать Следуя предложенному Джейсоном ниже, вот трассировка стека моего приложения:

#0  0x30c8e0a0 in __kill ()
#1  0x30c8e096 in kill ()
#2  0x30c8e088 in raise ()
#3  0x30ca2210 in abort ()
#4  0x32944a22 in __gnu_cxx::__verbose_terminate_handler ()
#5  0x335657ca in _objc_terminate ()
#6  0x32942df4 in __cxxabiv1::__terminate ()
#7  0x32942e48 in std::terminate ()
#8  0x32942f18 in __cxa_throw ()
#9  0x335646aa in objc_exception_throw ()
#10 0x32c91c9c in -[NSException raise] ()
#11 0x32b57db2 in -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] ()
#12 0x32b1b9da in _NSSetUsingKeyValueSetter ()
#13 0x32b1ae40 in -[NSObject(NSKeyValueCoding) setValue:forKey:] ()
#14 0x32b1adac in -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] ()
#15 0x315db6b6 in -[UIRuntimeOutletConnection connect] ()
#16 0x32c27bc6 in -[NSObject performSelector:] ()
#17 0x32c25a18 in -[NSArray makeObjectsPerformSelector:] ()
#18 0x315d5746 in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] ()
#19 0x315d53c0 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] ()
#20 0x314d5d50 in -[UIApplication _loadMainNibFile] ()
#21 0x314d5a7e in -[UIApplication _runWithURL:payload:launchOrientation:] ()
#22 0x31521962 in -[UIApplication handleEvent:withNewEvent:] ()
#23 0x315212e0 in -[UIApplication sendEvent:] ()
#24 0x31520d2a in _UIApplicationHandleEvent ()
#25 0x30d62b32 in PurpleEventCallback ()
#26 0x32c23d9c in CFRunLoopRunSpecific ()
#27 0x32c234e0 in CFRunLoopRunInMode ()
#28 0x314d54a8 in -[UIApplication _run] ()
#29 0x314d39f2 in UIApplicationMain ()
#30 0x00002f62 in main (argc=1, argv=0x2ffff5d8)

Как видите, он не выходит из функции main в main.m.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

Похоже, у вас есть некоторые соединения в основном Nib-файле, которые указывают на несуществующие выходы в загружаемом коде. Убедитесь, что вы загрузили Nib-файл, соответствующий платформе и синхронизированный с загружаемым кодом.

Если вы удаляете некоторые выходы в своем коде с помощью #if __IPHONE_..., убедитесь, что у вас нет Nib-файла, пытающегося сослаться на этот выход.

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

Для обработки определенных классов попробуйте (решение Jarad P) найдено в stackoverflow, список которого:


... " Рекомендация Apple об универсальных приложениях в Руководстве по программированию iPad: если вы хотите создать несколько версий ОС с несовместимыми API-интерфейсами, вам следует использовать NSClassFromString и перейти оттуда. Таким образом, вам нужен только один target (самая низкая ОС, которую вы поддерживаете), и в вашем коде есть такие вещи, как
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
   //Code for 3.2, e.g. [mplayerControllerClass alloc]
} else {
   //Code for pre-3.2 OSes
}
0 голосов
/ 27 апреля 2010

Вероятно, это не поможет решить вашу проблему, но если вы пытаетесь создать универсальный двоичный файл, использование #if не сработает. Универсальный двоичный файл должен содержать код для iPhone и iPad и определять во время выполнения, на каком устройстве он работает, например:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )

Кроме того, ваша условная компиляция только проверяет, что версия по крайней мере 3.2. Когда iPhone OS 4.0 будет выпущена для обоих устройств, вы получите код для функций только для iPad, включенных в сборку iPhone.

...