class_getClassMethod часто возвращает nil (кажется, работает только с методами уровня класса) - PullRequest
1 голос
/ 06 августа 2010

В настоящее время я пытаюсь использовать некоторый сгенерированный код из http://sudzc.com/ Этот код не идеально адаптирован к моим веб-службам, поэтому я попытался добавить категории к некоторым из сгенерированных классов и обменять их реализации с исходнымииспользуя method_exchangeImplementations из "objc / runtime.h".(Я мог бы изменить сгенерированный код напрямую, но я хочу избежать его).

Вот код, который я выполняю в 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 возвращают ноль ... Я использовал отладчик, поэтому я знаю, что 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

1 Ответ

9 голосов
/ 06 августа 2010

Неважно, моя ошибка, class_getClassMethod действительно должен работать только для методов уровня класса (как следует из названия)

Для методов экземпляра используйте ... class_getInstanceMethod ...:)

Извините за беспокойство

PB

...