2010-01-19 12 views
32

In Objective-C kann ich testen, ob eine bestimmte Klasse oder Instanz auf bestimmte Selektoren reagiert. Aber wie kann eine Klasse oder Instanz für alle ihre Methoden oder Eigenschaften einer Klasse abgefragt werden (z. B. eine Liste aller Methoden oder Eigenschaften)?erhalten Sie alle Methoden einer Objective-C-Klasse oder Instanz?

Ob dokumentiert oder nicht, es muss möglich sein, wie z.B. WebView kann ein scriptfähiges Plug-in-Objekt für alle Methoden und Eigenschaften abfragen, wenn sie für Skripts sichtbar sein sollen oder nicht.

Antwort

4

Dies ist über objc_method_list möglich. Um Ihre Methoden aufzuzählen, müssen Sie alle Ihre Methoden vorher registrieren.

Der Prozess ist einfach: Nachdem Sie Ihre Funktion deklariert haben, können Sie eine Instanz von objc_method erstellen und den Funktionsnamen registrieren. Dann fügen Sie die objc_method zu einem objc_method_list und schließlich die objc_method_list zu class_addMethods passieren ..

Hier ist ein Link zum Einstieg: http://theocacao.com/document.page/327

33

Sie können dies tun, und es sehr gut bei https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

dokumentiert alle Instanz oder Klasse Methoden einer Klasse zu holen, können Sie class_copyMethodList und iterieren die Ergebnisse verwenden. Ein Beispiel:

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

Sie müssen zwei separate Aufrufe dieser Methode durchführen. Ein für die Instanzmethoden und einen anderen für die Klassenmethoden:

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

das gleiche auf der Metaklasse Aufruf geben Ihnen die alle Klassenmethoden

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

Der Importpfad ist schwer zu finden, verwenden Sie: #import prewett

+0

Danke. Ich habe die Antwort bearbeitet, um den Import hinzuzufügen – Buzzy

+0

Danke, kann ein Tippfehler sein, "DumpObjcMethods (object_getClass (yourClass)/* Metaclass * /);" sollte sein: "DumpObjcMethods (object_getMetaClass (yourClass)/* Metaclass * /);" – Joey

17

Neben Buzzy Antwort. Zu Debuggingzwecken können Sie die private Methode -[NSObject _methodDescription] verwenden.

Entweder in LLDB:

(lldb) po [[UIApplication sharedApplication] _methodDescription] 

oder in Code:

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

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

Ausgang sieht wie folgt:

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

Beste Antwort bis jetzt – mafonya

Verwandte Themen