Ist es möglich zu finden, wo in einer Klassenhierarchie die von class_getInstanceMethod
abgerufene Methode herkommt? Angenommen, Klasse A implementiert myMethod. Jetzt sagen, ich habe Klasse A in Klasse A1 subclassed. Wenn ich class_getInstanceMethod(ClassA1, myMethod)
aufruft, ist es möglich zu sagen, ob die resultierende Methode in ClassA1 überschrieben wurde oder direkt von A1 kommt?
Ich nehme an, es wäre möglich, die Speicheradressen der IMPs zu vergleichen, wenn Sie Zugriff auf ClassA und ClassA1 hätten, aber ich habe keinen direkten Zugriff auf A.
Sie können immer auf die Superklasse einer Klasse zugreifen, sodass Sie sie an class_getInstanceMethod
oder class_getMethodImplementation
mit demselben SEL
übergeben und die IMP
-Adressen vergleichen können, um zu sehen, ob die Methode von der Unterklasse überschrieben wurde.
Das wird ein bisschen haariger, wenn Sie die Wurzelklasse erreichen wollen, die diese Methode definiert.
Wie auch immer, hier geht es:
%Vor%Hier ist meine modifizierte Version von Jacobs Code. Ich hatte Probleme mit seinem, weil class_getMethodImplementation einen _objc_msgForward zurückgab, der dazu führte, dass Methoden als überschrieben behandelt wurden. Ich brauchte auch * rootImpClass nicht, aber es ist einfach genug, um es wieder hinzuzufügen.
%Vor%Tags und Links objective-c ios objective-c-runtime