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

在iOS上,我试图使用Objective-C运行库( reference )中的method_invoke函数来调用一个返回types为void的Objective-C方法。

这在非ARC代码中工作正常,但启用ARC后,在调用objc_retain中的方法后,发生崩溃。 我认为发生的事情是编译器注意到method_invokeid的返回types,并试图保留method_invoke返回的值(注意method_invoke是为了返回它调用的方法的返回值)。

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

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

这似乎并没有工作(仍崩溃在objc_retain

(void)method_invoke(target, method)

这里有更正确的方法吗?

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

基本的方法是创build一个具有正确签名(void return type)的函数指针method_invoke ,并将method_invoke转换为该函数指针,然后通过函数指针调用。

所以,粗略地说:

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