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), которая исправляет эту проблему.