2010-01-19 14 views
32

En Objective-C puedo probar si una determinada clase o instancia responde a ciertos selectores. Pero, ¿cómo se puede consultar una clase o instancia para todos sus métodos o propiedades de una clase (por ejemplo, una lista de todos los métodos o propiedades)?obtener todos los métodos de una clase o instancia objetivo-c?

Ya sea que esté documentado o no, debe ser posible, como p. Ej. WebView puede consultar un objeto de secuencias de comandos de plugins para todos los métodos y propiedades si deben ser visibles para los scripts o no.

Respuesta

4

Esto es posible a través de objc_method_list. Para enumerar sus métodos, tendrá que registrar todos sus métodos de antemano.

El proceso es directo: una vez que haya declarado su función, puede crear una instancia de objc_method y registrar el nombre de la función. A continuación, añadir el objc_method a un objc_method_list y, finalmente, pasar el objc_method_list a class_addMethods ..

Aquí hay un enlace para que pueda empezar: http://theocacao.com/document.page/327

33

usted puede hacer esto y es muy bien documentado en https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

Para obtener todos los métodos de instancia o de clase de una clase, es posible utilizar class_copyMethodList y iterar sobre los resultados. Un ejemplo:

#import <objc/runtime.h> 

/** 
* Gets a list of all methods on a class (or metaclass) 
* and dumps some properties of each 
* 
* @param clz the class or metaclass to investigate 
*/ 
void DumpObjcMethods(Class clz) { 

    unsigned int methodCount = 0; 
    Method *methods = class_copyMethodList(clz, &methodCount); 

    printf("Found %d methods on '%s'\n", methodCount, class_getName(clz)); 

    for (unsigned int i = 0; i < methodCount; i++) { 
     Method method = methods[i]; 

     printf("\t'%s' has method named '%s' of encoding '%s'\n", 
       class_getName(clz), 
       sel_getName(method_getName(method)), 
       method_getTypeEncoding(method)); 

     /** 
     * Or do whatever you need here... 
     */ 
    } 

    free(methods); 
} 

Tendrá que hacer dos llamadas por separado a este método. Uno de los métodos de instancia y otra para los métodos de la clase:

/** 
* This will dump all the instance methods 
*/ 
DumpObjcMethods(yourClass); 

Llamada del mismo en la metaclase le dará todas los métodos de clase

/** 
* Calling the same on the metaclass gives you 
* the class methods 
*/ 
DumpObjcMethods(object_getClass(yourClass) /* Metaclass */); 
+1

La ruta de importación es difícil de encontrar, use: #import prewett

+0

Gracias. Edité la respuesta para agregar la importación – Buzzy

+0

Gracias, puede ser un error tipográfico, "DumpObjcMethods (object_getClass (yourClass)/* Metaclass * /);" debería ser: "DumpObjcMethods (object_getMetaClass (yourClass)/* Metaclass * /);" – Joey

17

Además de respuesta Buzzy. Para fines de depuración, puede usar el método privado -[NSObject _methodDescription].

Ya sea en LLDB:

(lldb) po [[UIApplication sharedApplication] _methodDescription] 

o en el código:

@interface NSObject (Private) 
- (NSString*)_methodDescription; 
@end 

// Somewhere in the code: 
NSLog(@"%@", [objectToInspect performSelector:@selector(_methodDescription)]); 

voluntad de salida se ve de la siguiente manera:

<__NSArrayM: 0x7f9 ddc4359a0>: 
in __NSArrayM: 
    Class Methods: 
     + (BOOL) automaticallyNotifiesObserversForKey:(id)arg1; (0x11503b510) 
     + (id) allocWithZone:(_NSZone*)arg1; (0x11503b520) 
     + (id) __new:::::(const id*)arg1; (0x114f0d700) 
    Instance Methods: 
     - (void) removeLastObject; (0x114f669a0) 
     - (void) dealloc; (0x114f2a8f0) 
     - (void) finalize; (0x11503b2c0) 
     - (id) copyWithZone:(_NSZone*)arg1; (0x114f35500) 
     - (unsigned long) count; (0x114f0d920) 
     - (id) objectAtIndex:(unsigned long)arg1; (0x114f2a730) 
     - (void) getObjects:(id*)arg1 range:(_NSRange)arg2; (0x114f35650) 
     - (void) addObject:(id)arg1; (0x114f0d8e0) 
     - (void) setObject:(id)arg1 atIndex:(unsigned long)arg2; (0x114f99680) 
     - (void) insertObject:(id)arg1 atIndex:(unsigned long)arg2; (0x114f0d940) 
     - (void) exchangeObjectAtIndex:(unsigned long)arg1 withObjectAtIndex:(unsigned long)arg2; (0x114f8bf80) 
     ...... 
in NSMutableArray: 
    Class Methods: 
     + (id) copyNonRetainingArray; (0x11ee20178) 
     + (id) nonRetainingArray; (0x11ee201e8) 
     + (id) nonRetainingArray; (0x120475026) 
     + (id) arrayWithCapacity:(unsigned long)arg1; (0x114f74280) 
     ...... 
+1

La mejor respuesta hasta ahora – mafonya

Cuestiones relacionadas