题 列出Objective-C对象的选择器


我有一个对象,我想列​​出它响应的所有选择器。感觉这应该是完全可能的,但我找不到API。


35
2017-12-01 04:13


起源




答案:


找件似找on找on找on似找on找件找on找件找件似找件找找件似找件找on似找找似似找on似找on似找找找件找件找件找件

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

#import <objc/runtime.h>

[..]

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 */

71
2017-12-01 05:54



这个答案为您提供了类方法。如果您希望对象响应的方法替换此行 Method * mlist = class_copyMethodList(object_getClass(t), &mc); 有这个 Method * mlist = class_copyMethodList(t, &mc); - bugloaf
@bugloaf你的评论有什么意义? object_getClass的签名需要一个类变量? - abbood
@abbood你对我的评论有什么不了解?我现在只是仔细检查了文档,我支持我的评论。 object_getClass 需要一个对象,并返回一个类对象,其参数是一个实例。如果 class_copyMethodList 找件找件找件on似找似找似on似找似似似找找似找件找似找似找找找件似似找找似找件件找似找件找似找件件找件找件如果传递一个常规对象,它将返回该对象上的方法。 - bugloaf
@bugloaf至少在iOS 9上,它会在传递常规对象时发生段错误。 - oarfish
哈哈@bugloaf你应该说“我的答案下面会给你类方法”,但不是“这个答案给你的课程方法”。哈哈,有人认为“这个答案”是“原始答案”,而不是你的答案。 - vietstone


我想通常你会想在控制台中这样做,而不是用调试代码混乱你的代码。这是在lldb中调试时如何做到这一点:

(假设一个对象t)

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

25
2017-11-06 08:43



在Xcode 9.3.1中不起作用 - 错误:没有用于调用'class_copyMethodList'候选函数的匹配函数不可行:第二个参数没有从'int *'到'unsigned int * _Nullable'的已知转换 - nbransby


Swift也可以这样做:

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]))]))
}

输出:

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,Xcode版本7.2(7C68)的6s模拟器进行测试。


4
2018-02-10 02:09





这样的东西应该工作(只需将它放在你很好奇的对象中)。例如,如果你有一个委托的对象,并想知道什么是“钩子”可用,这将打印出消息,为你提供线索:

-(BOOL) respondsToSelector:(SEL)aSelector {
    printf("Selector: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
    return [super respondsToSelector:aSelector];
}

请注意,我发现了这个 iPhone开发者的食谱 所以我不能相信!例如我得到的输出 UIViewController 实现协议 <UITableViewDelegate, UITableViewDataSource>

Selector: tableView:numberOfRowsInSection:
Selector: tableView:cellForRowAtIndexPath:
Selector: numberOfSectionsInTableView:
Selector: tableView:titleForHeaderInSection:
Selector: tableView:titleForFooterInSection:
Selector: tableView:commitEditingStyle:forRowAtIndexPath:
Selector: sectionIndexTitlesForTableView:
Selector: tableView:sectionForSectionIndexTitle:atIndex:
...
...
etc.,etc.

1
2017-12-01 05:11



找onon找找件找件找件找件找件似找件找件找on找on似找似似找on似找似似on似件on似件似onon似找件似似件似找件件找on找件似似找on找似件件似似件找件件似件件似件件似件件似件似件似找似件似件似件件找件似件似件件似件件似件 - nmr
这将仅列出在运行时动态查询的选择器(与Objective-C“非正式协议”一样),而不是对象响应的所有选择器。 - rvalue


从中获取灵感 JAL似找似onon似似找on似找似似件似找似件件找似似似件似件on似件似找似件似件找似似找似on似找似似件似件找似似件

extension NSObject {
    var __methods: [Selector] {
        var methodCount: UInt32 = 0
        guard
            let methodList = class_copyMethodList(type(of: self), &methodCount),
            methodCount != 0
        else { return [] }
        return (0 ..< Int(methodCount))
            .flatMap({ method_getName(methodList[$0]) })
    }
}

1
2018-05-15 23:06