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)?
[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.
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 .
To call an object's method, you must use the object name and the dot (.) operator followed by the method name, for example object.
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.
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) ......
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 */);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With