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

时间:2013-10-30 21:30:31

标签: ios objective-c automatic-ref-counting

在iOS上,我试图使用Objective-C运行时(reference)中的method_invoke函数来调用返回类型为{的声明的Objective-C方法{1}}。

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

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

method_invoke

这似乎不起作用( (void)((__bridge void *)method_invoke(target, method)); 仍然崩溃:

objc_retain

这里有更正确的方法吗?

1 个答案:

答案 0 :(得分:4)

This question实际上给了我一个更好的解决方案的想法。

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

所以,粗略地说:

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