Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get all methods of an Objective-C class or instance

In Objective-C I can test whether a given class or instance responds to certain selectors. But how can query a class or instance for all its methods or properties of a class (e.g. a list of all methods or properties)?

like image 778
Georg Fritzsche Avatar asked Jan 19 '10 15:01

Georg Fritzsche


People also ask

How do I find the class of an object in Objective-C?

[yourObject isKindOfClass:[a class]] // Returns a Boolean value that indicates whether the receiver is an instance of // given class or an instance of any class that inherits from that class.

What is instance method in Objective-C?

Instance method are methods that are specific to particular classes. Instance methods are declared and defined followed by - (minus) symbol. Class methods can be called by class name itself . Class methods are declared and defined by using + (plus)sign .

How do you call a method from an instance of a class?

To call an object's method, you must use the object name and the dot (.) operator followed by the method name, for example object.

Can I use C in Objective-C?

You really can't use C in Objective-C, since Objective-C is C. The term is usually applied when you write code that uses C structures and calls C functions directly, instead of using Objective-C objects and messages.


2 Answers

In addition to Buzzy's answer, for debugging purposes you may use the -[NSObject _methodDescription] private method.

Either in lldb:

(lldb) po [[UIApplication sharedApplication] _methodDescription] 

or in code:

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

Output will look as following:

<__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)         ...... 
like image 149
Borys Verebskyi Avatar answered Sep 29 '22 14:09

Borys Verebskyi


You can do this and it is extremely well documented at https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

To fetch all the instance or class methods of a class, you may use class_copyMethodList and iterate over the results. An example:

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

You will need to make two separate calls to this method. One for the instance methods and another for the class methods:

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

Calling the same on the metaclass will give you all the class methods

/**  *  Calling the same on the metaclass gives you  *  the class methods  */ DumpObjcMethods(object_getClass(yourClass) /* Metaclass */); 
like image 24
Buzzy Avatar answered Sep 29 '22 13:09

Buzzy