Ios 使用Objective-C';s method_调用以调用ARC下的void方法

Ios 使用Objective-C';s method_调用以调用ARC下的void方法,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,在iOS上,我试图使用Objective-C运行时()中的方法调用函数,以便调用返回类型为void的Objective-C方法 这在非ARC代码中工作得很好,但启用ARC后,调用objc_retain中的方法后,我会发生崩溃。我认为编译器注意到method\u invoke的返回类型为id,并试图保留method\u invoke返回的值(注意method\u invoke是指返回它调用的方法的返回值) 在这种特定情况下,让编译器知道method\u invoke的返回值是垃圾且不应保留的正确方

在iOS上,我试图使用Objective-C运行时()中的
方法调用
函数,以便调用返回类型为
void
的Objective-C方法

这在非ARC代码中工作得很好,但启用ARC后,调用
objc_retain
中的方法后,我会发生崩溃。我认为编译器注意到
method\u invoke
的返回类型为
id
,并试图保留
method\u invoke
返回的值(注意
method\u invoke
是指返回它调用的方法的返回值)

在这种特定情况下,让编译器知道
method\u invoke
的返回值是垃圾且不应保留的正确方法是什么?以下内容似乎可行,但在概念上似乎是错误的:


(void)(((桥void*)方法调用(目标,方法));

这似乎不起作用(仍然在
objc\u retain
中崩溃):


(void)方法调用(目标,方法)

这里有更正确的方法吗?

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

基本方法是使用正确的签名(无效返回类型)创建引用
method\u invoke
的函数指针,并将
method\u invoke
强制转换到此函数指针中,然后通过函数指针调用

因此,大致上:

static void (*_method_invoke_void)(id, Method, ...) = (void (*)(id, Method, ...)) method_invoke;
... snip ...
_method_invoke_void(target, method);
实际上给了我一个更好的解决方案

基本方法是使用正确的签名(无效返回类型)创建引用
method\u invoke
的函数指针,并将
method\u invoke
强制转换到此函数指针中,然后通过函数指针调用

因此,大致上:

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

获取
IMP
并将其转换为正确的类型并直接调用它我不认为
method\u invoke
会尝试保留返回值,但ARC会对传递给方法的所有参数调用
objc\u retain
。是否确实分配了
target
objc\u retain
上设置一个断点以查看何时调用它。直接调用IMP也有同样的问题。target肯定是一个有效的对象,是的,我可以确认该方法确实被调用。get
IMP
并将其转换为正确的类型并直接调用我认为
method\u invoke
不会试图保留返回值,但是ARC对传递给方法的所有参数调用
objc_retain
。你确定分配了
target
吗?执行是否在方法内的断点处停止?你也可以在
objc_retain
上设置断点,以查看何时调用它。直接调用IMP也有同样的问题。target肯定是一个有效的对象,一个nd是的,我可以确认该方法是否被调用。无论是否使用ARC,都需要将方法\u invoke转换为正确的函数指针类型。如果不这样做,ARC很可能会中断。请注意,还必须为调用替换正确的参数列表。将方法\u invoke转换为正确的带或不带ARC都需要函数指针类型。如果不这样做,ARC更容易断开。请注意,您还必须为您的调用使用正确的参数列表替换