2010-07-16 6 views
29

Methode Swizzling funktioniert gut zum Beispiel Methoden. Jetzt muss ich eine Klassenmethode wechseln. Irgendeine Idee, wie es geht?Wie man eine Klassenmethode auf iOS swizzle?

dies versucht, aber es funktioniert nicht:

void SwizzleClassMethod(Class c, SEL orig, SEL new) { 

Method origMethod = class_getClassMethod(c, orig); 
Method newMethod = class_getClassMethod(c, new); 

if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
    class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
else 
    method_exchangeImplementations(origMethod, newMethod); 
} 

Antwort

53

Es stellte sich heraus, ich war nicht weit entfernt. Diese Implementierung funktioniert für mich:

void SwizzleClassMethod(Class c, SEL orig, SEL new) { 

    Method origMethod = class_getClassMethod(c, orig); 
    Method newMethod = class_getClassMethod(c, new); 

    c = object_getClass((id)c); 

    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    else 
     method_exchangeImplementations(origMethod, newMethod); 
} 
+0

Mmm ... Sagen wir, wir haben statt 'Class cc = object_getClass ((id) c)'. Es ist verständlich, dass Sie die Methode zu 'cc' hinzufügen müssen, aber warum haben Sie die Klassenmethode von' cc' genommen? Soll die Klassenmethode nicht von 'c' kommen? Ich bin verwirrt ... – Yuji

+0

Yuhi, du hast Recht, ich habe den Code geändert, um die Methodenauflösung für die ursprüngliche Klasse, nicht die Meta-Klasse zu tun. Die alte Lösung funktionierte auch, also kümmerte ich mich nicht wirklich darum. –

+0

Mein schlechtes. Ich habe object_getClass in objc_getClass vertippt. Ich lösche meine Antwort in einer Sekunde. –

Verwandte Themen