2

現在、 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は実際にクラスレベルのメソッドに対してのみ機能するはずですか?

最後に、デバイスではなくシミュレーターで開発しています:)

どんな考えでも大歓迎です!

ありがとう

PB

4

1 に答える 1

11

気にしないでください、私の間違い、class_getClassMethodは確かにクラスレベルのメソッドに対してのみ機能することになっています(名前が示すように)

インスタンスメソッドの場合は、... class_getInstanceMethod...:)を使用します。

ご迷惑おかけして申し訳ありません

PB

于 2010-08-06T14:08:52.670 に答える