使用 Objective-C 的method_invoke在 ARC 下调用 void 方法



在iOS上,我尝试使用Objective-C运行时(参考)中的method_invoke函数来调用返回类型为void的Objective-C方法。

这在非 ARC 代码中工作正常,但在启用 ARC 的情况下,我在 objc_retain 中调用该方法后出现崩溃。我认为正在发生的事情是编译器注意到method_invoke的返回类型id,并试图保留method_invoke返回的值(请注意,method_invoke旨在返回它调用的方法的返回值)。

让编译器知道在这种特定情况下,method_invoke的返回值是垃圾,不应保留的正确方法是什么?以下方法似乎有效,但在概念上似乎是错误的:

(void)((__bridge void *)method_invoke(target, method));

这似乎不起作用(仍然在objc_retain崩溃:

(void)method_invoke(target, method)

这里有更正确的方法吗?

这个问题实际上给了我一个更好的解决方案的想法。

基本方法是创建一个引用具有正确签名(void 返回类型)method_invoke的函数指针,并将method_invoke强制转换为此函数指针,然后通过函数指针调用。

所以,粗略地说:

static void (*_method_invoke_void)(id, Method, ...) = (void (*)(id, Method, ...)) method_invoke;
... snip ...
_method_invoke_void(target, method);

最新更新