Mit class_getInstanceMethod - wo ist die Methode in der Klassenhierarchie implementiert?

8

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.

    
Sean Danzeiser 09.04.2013, 18:20
quelle

2 Antworten

15

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%     
Jacob Relkin 09.04.2013, 18:24
quelle
3

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%     
David Lawson 04.02.2014 03:51
quelle