2010-01-19 10 views
32

En Objective-C je peux tester si une classe ou une instance donnée répond à certains sélecteurs. Mais comment interroger une classe ou une instance pour toutes ses méthodes ou propriétés d'une classe (par exemple une liste de toutes les méthodes ou propriétés)?Obtenir toutes les méthodes d'une classe ou d'une instance d'objectif-c?

Que ce soit documenté ou non, il doit être possible, par ex. WebView peut interroger un objet scriptable plugins pour toutes les méthodes et propriétés si elles doivent être visibles pour les scripts ou non.

Répondre

4

Ceci est possible via objc_method_list. Afin d'énumérer vos méthodes, vous devrez enregistrer toutes vos méthodes auparavant.

Le processus est simple: après avoir déclaré votre fonction, vous pouvez créer une instance de objc_method et enregistrer le nom de la fonction. Ajoutez ensuite le objc_method à un objc_method_list et enfin passer le objc_method_list à class_addMethods ..

Voici un lien pour vous aider à démarrer: http://theocacao.com/document.page/327

33

vous pouvez le faire et il est extrêmement bien documenté à https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

Pour chercher toutes les méthodes d'instance ou de classe d'une classe, vous pouvez utiliser class_copyMethodList et itérer sur les résultats. Un exemple:

#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); 
} 

Vous devrez effectuer deux appels distincts à cette méthode. L'une des méthodes d'instance et une autre pour les méthodes de classe:

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

Appeler le même sur la métaclasse vous donnera toutes les méthodes de classe

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

Le chemin d'importation est difficile à trouver, utilisez: #import prewett

+0

Merci. J'ai édité la réponse pour ajouter l'importation – Buzzy

+0

Merci, peut-être une faute de frappe, "DumpObjcMethods (object_getClass (yourClass)/* Metaclass * /);" doit être: "DumpObjcMethods (object_getMetaClass (yourClass)/* Metaclass * /);" – Joey

17

En plus de répondre Buzzy. Pour le débogage, vous pouvez utiliser la méthode privée -[NSObject _methodDescription].

Soit en LLDB:

(lldb) po [[UIApplication sharedApplication] _methodDescription] 

ou dans le code:

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

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

volonté de sortie se présente comme suit:

<__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

Meilleure réponse pour l'instant – mafonya