2

在 iOS 上,我试图使用method_invokeObjective-C 运行时(参考)中的函数来调用一个声明为返回类型的 Objective-C 方法void

这在非 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)

这里有更正确的方法吗?

4

1 回答 1

4

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

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

所以,大致:

static void (*_method_invoke_void)(id, Method, ...) = (void (*)(id, Method, ...)) method_invoke;
... snip ...
_method_invoke_void(target, method);
于 2013-10-30T22:07:32.640 回答