菜鸟教程小白 发表于 2022-12-13 05:19:31

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


                                            <p><p>在 iOS 上,我尝试使用 Objective-C 运行时 (<a href="https://developer.apple.com/library/ios/documentation/cocoa/reference/ObjCRuntimeRef/Reference/reference.html#jumpTo_51" rel="noreferrer noopener nofollow">reference</a>) 中的 <code>method_invoke</code> 函数来调用声明为返回类型的 Objective-C 方法<code>无效</code>.</p>

<p>这在非 ARC 代码中运行良好,但启用 ARC 后,在调用 <code>objc_retain</code> 中的方法后我会崩溃。我认为发生了什么是编译器注意到 <code>method_invoke</code> 的返回类型 <code>id</code>,并尝试保留 <code>method_invoke</code> 返回的值(注意<code>method_invoke</code> 意味着返回它调用的方法的返回值)。</p>

<p>让编译器知道在这种特定情况下,<code>method_invoke</code> 的返回值是垃圾,不应该保留的正确方法是什么?以下似乎可行,但在概念上似乎是错误的:</p>

<p><code>
(void)((__bridge void *)method_invoke(target, method));
</code></p>

<p>这似乎不起作用(仍然在 <code>objc_retain</code> 中崩溃:</p>

<p><code>
(void)method_invoke(目标,方法)
</code></p>

<p>这里有更正确的方法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p> <a href="https://stackoverflow.com/questions/19507456/sudzc-arc-version-objc-msgsend-call-causes-exc-bad-access-using-64-bit-archite" rel="noreferrer noopener nofollow">This question</a> 实际上给了我一个更好的解决方案的想法。</p>

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

<p>所以,大致:</p>

<pre><code>static void (*_method_invoke_void)(id, Method, ...) = (void (*)(id, Method, ...)) method_invoke;
... snip ...
_method_invoke_void(target, method);
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ARC下使用Objective-C的method_invoke调用void方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19694173/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19694173/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ARC下使用Objective-C的method_invoke调用void方法