获取 Objective-C 类或实例的所有方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2094702/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get all methods of an Objective-C class or instance
提问by Georg Fritzsche
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)?
在 Objective-C 中,我可以测试给定的类或实例是否响应某些选择器。但是如何查询类或实例的所有方法或类的属性(例如,所有方法或属性的列表)?
采纳答案by Ben Gottlieb
You'll want to use the Objective C runtime methods, see here: https://developer.apple.com/reference/objectivec/objective_c_runtime
您需要使用 Objective C 运行时方法,请参见此处:https: //developer.apple.com/reference/objectivec/objective_c_runtime
回答by Buzzy
You can do this and it is extremely well documented at https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html
你可以做到这一点,它在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_copyMethodListand iterate over the results. An example:
要获取类的所有实例或类方法,您可以使用class_copyMethodList并迭代结果。一个例子:
#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 */);
回答by Borys Verebskyi
In addition to Buzzy's answer, for debugging purposes you may use the -[NSObject _methodDescription]private method.
除了 Buzzy 的回答之外,出于调试目的,您可以使用-[NSObject _methodDescription]私有方法。
Either in lldb:
无论是在 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 looks 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)
......
回答by user250120
This is possible via objc_method_list. In order to enumerate your methods, you will have to register all your methods before hand.
这可以通过 objc_method_list 实现。为了枚举你的方法,你必须事先注册所有的方法。
The process is straight forward: after you've declared your function you can create an instance of objc_method and register the function name. Then add the objc_method to a objc_method_list and finally pass the objc_method_list to class_addMethods..
该过程很简单:在声明函数后,您可以创建 objc_method 的实例并注册函数名称。然后将 objc_method 添加到 objc_method_list 并最后将 objc_method_list 传递给 class_addMethods..
Here is a link to get you started: http://theocacao.com/document.page/327
这是一个让您入门的链接:http: //theocacao.com/document.page/327

