使用Objective-C的method_invoke在ARC下调用void方法
在iOS上,我试图使用Objective-C运行库( reference )中的method_invoke
函数来调用一个返回types为void
的Objective-C方法。
这在非ARC代码中工作正常,但启用ARC后,在调用objc_retain
中的方法后,发生崩溃。 我认为发生的事情是编译器注意到method_invoke
的id
的返回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);