gpt4 book ai didi

iphone - 在方法中获取参数类型

转载 作者:太空狗 更新时间:2023-10-30 03:47:37 25 4
gpt4 key购买 nike

我正在尝试对某个类进行子类化并重写它的一些私有(private)方法。这很危险,可能会失败,无法通过 Apple 的审核(在 AppStore 中),可能会产生可怕的影响等,但这仅用于实验/教育目的:)

例如,假设我想知道 UITextView 的实例方法 keyboardInput:shouldInsertText:isMarkedText: 的第一个参数的类型:

SEL selector = @selector(keyboardInput:shouldInsertText:isMarkedText:);
Class class = [UITextView class];
Method method = class_getInstanceMethod(class, selector);
char *arg = method_copyArgumentType(method, 0);
printf("_%s_\n", arg);
free(arg);

但是在控制台中我只得到 _@_ 。我认为 @ 意味着 object 但什么类的对象? (我想我会得到参数类的名称)是否可以使用其他 objective-c runtime functions 来获取该参数的类还是其他什么意思?

PS:在示例中,我使用了一类 Cocoa touch,但我本可以尝试使用一类 Cocoa 进行完全相同的操作。所以这不应该特定于 iOS。

已解决:

我已经在模拟器中尝试了 Dave 的建议,它成功了!

(gdb) info all-registers 给了我一长串值,...

((gdb) po *(id*)($ebp + 8)
<MyTextView: 0x5911270; baseClass = UITextView; frame = (80 70; 240 323); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x5c0c7d0>; contentOffset: {0, 0}>

(gdb) p *(SEL*)($ebp + 12)
$5 = (SEL) 0xbd19

(gdb) po *(id*)($ebp + 16)
<UIWebDocumentView: 0xa02f000; frame = (0 0; 240 457); text = 'Lorem ipsum dolor sit er ...'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x5c35070>>

(gdb) po *(id*)($ebp + 20)
t

(gdb) p *(id*)($ebp + 24)
$6 = (id) 0x0

这是有道理的,因为我按下的键是一个“t”,所以它没有标记文本(“0x0”)所以我认为第一个参数应该是 UIWebDocumentView 类型.

只是一件小事(在这种情况下无关紧要),我如何从 gbd 中的 SEL 获取方法名称?例如 $5 ?

最佳答案

你无法通过接口(interface)的内省(introspection)来判断参数的类。一旦你被编译,所有的 id 在 Objective-C 中都是平等的。但是,您可以询问特定实例的 -class。因此,如果您尝试对内部方法进行逆向工程,则需要调配该方法,调用它,然后反省传递给您的对象。谷歌“method swizzling”以获得大量关于如何将代码注入(inject)任何 Objective-C 方法的讨论。

关于iphone - 在方法中获取参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6714801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com