Примечание, не проверенное на Xcode 5.
Я использовал @ jon-reid's answer , но обнаружил, что Xcode добавляет переменные окружения в часть xcuserstated
XcodeProjects, и они специфичны для пользователя и обычно не фиксируются в репозитории. Таким образом, я прошептаю свой AppDelegate
, чтобы переопределить его загрузку:
@implementation MyAppDelegate (Testing)
+ (void)initialize {
SEL new = @selector(application:didFinishLaunchingWithOptions:);
SEL orig = @selector(swizzled_application:didFinishLaunchingWithOptions:);
Class c = [self class];
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if (class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
} else {
method_exchangeImplementations(origMethod, newMethod);
}
}
- (BOOL)swizzled_application:(id)app didFinishLaunchingWithOptions:(id)opts {
return YES;
}
@end
Обратите внимание, что следующее проще и все еще работает, хотя я не уверен, что это надежно:
@implementation MyAppDelegate (Testing)
- (BOOL)application:(id)app didFinishLaunchingWithOptions:(id)opts {
return YES;
}
@end
Это работает, потому что категории методов в динамически загружаемых компонентах (например, в тестовом комплекте) имеют преимущество. Swizzling чувствует себя безопаснее, хотя.