GHUnit работает в симуляторе, но не на iPhone

Итак, сегодня я играл с GHUnit, и у меня есть несколько хороших тестов, которые прекрасно работают в симуляторе в XCode4. Когда я запускаю их на самом iPhone, я получаю следующую ошибку:

'Unable to instantiate the UIApplication delegate instance.
No class named GHUnitIPhoneAppDelegate is loaded.'

Прежде чем спросить, да у меня есть варианты компоновщика -ObjC а также -all_load установить, и, как я уже сказал, он отлично работает в симуляторе, так почему бы не сам iPhone?

Озадаченный!

3 ответа

Решение

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

По какой-то причине я все еще не совсем понимаю, что такое замена:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");

от

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIOSAppDelegate");

в основном файле исправит проблему.

Класс GHUnitIPhoneAppDelegate наследуется от GHUnitIOSAppDelegate но это не входит в окончательный двоичный файл (я побежал nm -a GHUnitIPhoneAppDelegate|grep IPhoneAppбез результата).

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

Надеюсь, это поможет, по крайней мере, это сработало для меня.

Просто чтобы уточнить, GHUnitIOS-0.4.32, загруженный 8/11/2011 на https://github.com/gabriel/gh-unit/downloads throws

NSInternalInconsistencyException', reason: 'Unable to instantiate the UIApplication delegate instance. No class named GHUnitIPhoneAppDelegate is loaded.'

если int main(int argc, char *argv[]) содержит:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");

Это работает для:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIOSAppDelegate");

Поскольку GHUnitIOSAppDelegate отсутствует в библиотеках armv6 и armv7. Обратите внимание, что GHUnitIPhoneAppDelegate находится в симуляторе lib...

GHUnitIOS.framework$ nm -a -arch i386 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS(GHUnitIPhoneAppDelegate.o):
00000084 S _OBJC_CLASS_$_GHUnitIPhoneAppDelegate
00000070 S _OBJC_METACLASS_$_GHUnitIPhoneAppDelegate
00000048 s l_OBJC_CLASS_RO_$_GHUnitIPhoneAppDelegate
00000020 s l_OBJC_METACLASS_RO_$_GHUnitIPhoneAppDelegate
GHUnitIOS.framework$

Но не в любом из двух устройств libs...

GHUnitIOS.framework$ nm -a -arch armv6 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS.framework$

GHUnitIOS.framework$ nm -a -arch armv7 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS.framework$

Я оставлю ответ @apouche как принятый, так как это решило мою проблему и помогло мне.

Однако получил сообщение от gabriel, разработчика GHUnit, в котором говорилось, что это ошибка, и что он выпустил новую версию (0.4.32), которая исправляет эту проблему.

Другие вопросы по тегам