Class_getClassMethod geralmente retorna nil (parece funcionar apenas com métodos de nível de classe)
-
26-09-2019 - |
Pergunta
Atualmente estou tentando usar algum código gerado de http://sudzc.com/Esse código não está perfeitamente adaptado aos meus serviços da Web, então tentei adicionar categorias a algumas das classes geradas e trocar suas implementações com as originais usando o método_exchangeImplementations de "objc/runtime.h". (Eu poderia modificar diretamente o código gerado, mas quero evitá -lo).
Aqui está o código que executo no MyAppAppDelegate - Método de 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);
Conforme declarado na minha pergunta, quase todos esses Class_getClassMethod estão retornando nil ... Eu usei o depurador, então eu sei que 'TheClass' está definido corretamente. O único método encontrado são os da classe SOAP, que são métodos de nível de classe (+). Mas de vários exemplos na rede, concluí que ela deveria funcionar para os outros também ...
Aqui estão os meus inclui para 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"
Também testei minhas categorias e elas funcionei, posso chamar os métodos de categoria de um objeto 'originalclass'.
Suponho que estou fazendo algo errado, mas não consigo ver o que ... ou talvez Class_GetclassMethod de realmente funcionar apenas para métodos de nível de classe?
Ho e a última coisa, estou desenvolvendo no simulador, não no dispositivo :)
Qualquer pensamento é bem -vindo!
Obrigado
Pb
Solução
Não importa, meu erro, Class_getClassMethod deve realmente funcionar apenas para métodos de nível de classe (como o nome implica)
Por exemplo, métodos, use ... class_getInstanceMethod ... :)
Desculpe o incómodo
Pb