如何知道block的参数类型和返回值类型?

反编译的时候发现有个函数用了一个block做参数, 反编译出来的类型是id, 用nslog打印这个参数得到的只是__NSStackBlock__. 那如何可以知道block的参数类型和返回值类型? oc里面好像没有reflection方法去获取block的信息.

用IDA看

可以参考下我博客的这篇文章哦:http://www.swiftyper.com/2016/12/16/debuging-objective-c-blocks-in-lldb/

1 个赞

赞。干货推荐单独发帖

按照你文章的方法, 可以写个一句话指令po [NSMethodSignature signatureWithObjCTypes:((char**)(((char**)((char*)blockArg + 24))+ 16))] . 这个指令在模拟器里面是正常输出的, 但是在 iphone 真机上输出一个地址, 再 po 一次这个地址就正常了, 比较奇怪.

修正一下, iphone 上用 po [[NSMethodSignature signatureWithObjCTypes:((char**)(((char**)((char*)blockArg + 24))+ 16))] debugDescription]

objective c blocks - iOS NSMethodSignature (or encoding) of NSBlock - Stack Overflow
http://stackoverflow.com/questions/12715586/ios-nsmethodsignature-or-encoding-of-nsblock

发现一个库: GitHub - ebf/CTObjectiveCRuntimeAdditions: Objc runtime additions.

:grin:新开了个帖

这个库很方便啊,之前怎么没想到自己封装一个:joy: