ventajas objective metodos importar herencia desventajas clases objective-c cocoa introspection

objective-c - objective - importar clases en python



obtener todos los métodos de una clase o instancia objetivo-c? (4)

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)?

Ya sea que esté documentado o no, tiene que ser posible, por ejemplo, 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.


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

Ya sea en lldb:

(lldb) po [[UIApplication sharedApplication] _methodDescription]

o en código:

@interface NSObject (Private) - (NSString*)_methodDescription; @end // Somewhere in the code: NSLog(@"%@", [objectToInspect performSelector:@selector(_methodDescription)]);

La salida se verá 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) ......


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, agregue objc_method a objc_method_list y finalmente pase objc_method_list a class_addMethods ..

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


Puede hacerlo y está extremadamente bien documentado en https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

Para buscar todos los métodos de instancia o clase de una clase, puede usar class_copyMethodList e 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 para los métodos de instancia y otro para los métodos de clase:

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

Llamar lo mismo en la metaclase le dará todos los métodos de clase

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