2009-10-28 7 views
24

Ho provato sia JRSwizzle, sia MethodSwizzle. Compilano bene sul simulatore ma generano un sacco di errori quando provo a compilare per Device (3.x)Metodo Swizzle su dispositivo iPhone

Qualcuno ha avuto qualche fortuna swizzling su iPhone? Qual è il trucco?

TIA

risposta

54

Il wiki CocoaDev ha una vasta discussione sul metodo swizzling here. Mike Ash ha una relativamente semplice implementazione in fondo a quella pagina:

#import <objc/runtime.h> 
#import <objc/message.h> 
//.... 

void Swizzle(Class c, SEL orig, SEL new) 
{ 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(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); 
} 

non ho ancora testato questo, semplicemente perché mi considerano metodo swizzling come un processo estremamente pericoloso e non ho avuto la necessità di utilizzare ancora.

+3

grazie che ha funzionato. La chiave per l'utilizzo era la #import #import dizy

+0

Wiki link no worky – funkybro

+0

@funkybro - Grazie per averlo fatto notare. Ho tirato fuori una versione archiviata della pagina, prima che fosse rimossa. Quando il wiki ritorna, sostituirò il link all'archivio. –