首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C对象的列表选择器

Objective-C对象的列表选择器
EN

Stack Overflow用户
提问于 2008-12-01 12:13:18
回答 6查看 16.6K关注 0票数 40

我有一个对象,我想列出它响应的所有选择器。感觉这应该是完全有可能的,但我在寻找API时遇到了麻烦。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-12-01 05:54:53

这是一个基于运行时C函数的解决方案:

给定一个可从对象获取的类对象,class_copyMethodList返回一个类方法列表。

代码语言:javascript
复制
#import <objc/runtime.h>

。。

代码语言:javascript
复制
SomeClass * t = [[SomeClass alloc] init];

int i=0;
unsigned int mc = 0;
Method * mlist = class_copyMethodList(object_getClass(t), &mc);
NSLog(@"%d methods", mc);
for(i=0;i<mc;i++)
    NSLog(@"Method no #%d: %s", i, sel_getName(method_getName(mlist[i])));

/* note mlist needs to be freed */
票数 77
EN

Stack Overflow用户

发布于 2013-11-06 16:43:38

我认为通常你会想在控制台中做这件事,而不是用调试代码把你的代码搞得一团糟。这就是你在lldb中调试的方法:

(假设对象为t)

代码语言:javascript
复制
p int $num = 0;
expr Method *$m = (Method *)class_copyMethodList((Class)object_getClass(t), &$num);
expr for(int i=0;i<$num;i++) { (void)NSLog(@"%s",(char *)sel_getName((SEL)method_getName($m[i]))); }
票数 29
EN

Stack Overflow用户

发布于 2016-02-10 10:09:33

使用Swift也可以做到这一点:

代码语言:javascript
复制
let obj = NSObject()

var mc: UInt32 = 0
let mcPointer = withUnsafeMutablePointer(&mc, { $0 })
let mlist = class_copyMethodList(object_getClass(obj), mcPointer)

print("\(mc) methods")

for i in 0...Int(mc) {
    print(String(format: "Method #%d: %s", arguments: [i, sel_getName(method_getName(mlist[i]))]))
}

输出:

代码语言:javascript
复制
251 methods
Method #0: hashValue
Method #1: postNotificationWithDescription:
Method #2: okToNotifyFromThisThread
Method #3: fromNotifySafeThreadPerformSelector:withObject:
Method #4: allowSafePerformSelector
Method #5: disallowSafePerformSelector
...
Method #247: isProxy
Method #248: isMemberOfClass:
Method #249: superclass
Method #250: isFault
Method #251: <null selector>

使用运行iOS 9.2,Xcode7.2版(7C68)的6s模拟器进行测试。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/330030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档