2012-12-10 78 views
1

我想在iOS中使用Hook委托(协议)方法,谁可以告诉我该怎么做?连接iPhone中的协议

如钩方法applicationDidFinishLaunching:

我不喜欢这样,但它不工作...

extern IMP original_UIApplication_applicationDidFinishLaunching; 
extern void replaced_UIApplication_applicationDidFinishLaunching(UIApplication<UIApplicationDelegate> * self, SEL cmd, UIApplication* application); 

MSHookMessageEx(objc_getMetaClass("UIApplication"), 
       @selector(applicationDidFinishLaunching:), 
       (IMP)replaced_UIApplication_applicationDidFinishLaunching, 
       (IMP *)&original_UIApplication_applicationDidFinishLaunching); 

回答

0

的applicationDidFinishLaunching是由应用程序委托实现的方法,而不是UIApplication的本身。完全没有理由为什么你需要在UIApplication上调试方法。只需在委托中实现这些方法。

对于要覆盖Apple提供的类中的方法的情况,您可以通过在它们上创建类别来实现。添加的类别方法将通过相同的方法签名覆盖系统方法。

+0

许多非常感谢。 – ataraxia

+0

即使老问题,为什么你没有看到任何理由来改变'UIApplicationDelegate'方法呢? – atxe

0

你shound交换谁实施了protocol.like这个类的方法:

// Protocol Method Exchange 
    int numClasses = objc_getClassList(NULL, 0); 

    Class *list = (Class *)malloc(sizeof(Class) * numClasses); 
    objc_getClassList(list, numClasses); 
    for (int i = 0; i < numClasses; i++) { 
     if (class_conformsToProtocol(list[i], @protocol(TowstViewDelegate)) && 
      class_getInstanceMethod(list[i], @selector(submit))) { 
      NSLog(@"%@ sumit have exchanged",NSStringFromClass(list[i])); 
      jm_swizzleSelector(list[i], @selector(submit), @selector(hk_submit)); 
     } 
    } 
    free(list); 
    NSLog(@"Exchange END"); 
+0

为什么“喜欢这个??”一个好的答案将总是解释所做的事情以及为什么这样做,不仅是为了OP,而且是为了将来访问SO。 请添加一些描述,以使其他人了解。 –