我目前正在尝试使用来自http://sudzc.com/的一些生成代码 此代码并不完全适合我的 Web 服务,因此我尝试将类别添加到一些生成的类中,并使用它们与原始类交换它们的实现来自“objc/runtime.h”的method_exchangeImplementations。(我可以直接修改生成的代码,但我想避免它)。
这是我在 MyAppAppDelegate 中执行的代码 - applicationDidFinishLaunching 方法
Class theClass = [CBMayaIPhoneUser class];
Method originalMethod = class_getClassMethod(theClass, @selector(initWithNode:));
Method categoryMethod = class_getClassMethod(theClass, @selector(initWithAllStringNode:));
method_exchangeImplementations(originalMethod, categoryMethod);
theClass = [Soap class];
originalMethod = class_getClassMethod(theClass, @selector(getNodeValue:withName:));
categoryMethod = class_getClassMethod(theClass, @selector(getHrefNodeValue:withName:));
method_exchangeImplementations(originalMethod, categoryMethod);
theClass = [SoapRequest class];
originalMethod = class_getClassMethod(theClass, @selector(send));
categoryMethod = class_getClassMethod(theClass, @selector(sendIgnoringCertificate));
method_exchangeImplementations(originalMethod, categoryMethod);
originalMethod = class_getClassMethod(theClass, @selector(connectionDidFinishLoading:));
categoryMethod = class_getClassMethod(theClass, @selector(connectionDidFinishLoadingAndSentBody:));
method_exchangeImplementations(originalMethod, categoryMethod);
正如我的问题所述,几乎所有这些 class_getClassMethod 都返回 nil ......我使用了调试器,所以我知道 'theClass' 设置正确。唯一找到的方法是 Soap 类的方法,它们都是类级别 (+) 方法。但从网上的各种例子中,我得出结论,它也应该适用于其他人......
这是我对 MyAppAppDelegate.m 的包含:
#import "MyAppAppDelegate.h"
#import "RootViewController.h"
#import "MyGlobalVariables.h"
#import "MyWebServiceExample.h"
#import "Soap+Href.h"
#import "SoapRequest+Certificate.h"
#import "CBMayaIPhoneUser+AllString.h"
#import "objc/runtime.h"
我也测试了我的类别并且它们有效,我可以从“originalClass”对象调用类别方法。
我想我做错了什么,但我看不到什么......或者也许 class_getClassMethod 确实应该只适用于类级别的方法?
何最后一件事,我在模拟器上开发,而不是设备:)
欢迎任何想法!
谢谢
铅