gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:44:56 25 4
gpt4 key购买 nike

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

这在非 ARC 代码中运行良好,但启用 ARC 后,我在调用 objc_retain 中的方法后发生崩溃。我认为发生的事情是编译器注意到 method_invoke 的返回类型 id,并试图保留 method_invoke 返回的值(注意method_invoke 是为了返回它调用的方法的返回值)。

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


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

这似乎不起作用(仍然在 objc_retain 中崩溃:


(无效)method_invoke(目标,方法)

这里有没有更正确的做法?

最佳答案

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

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

所以,大致:

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

关于ios - 使用 Objective-C 方法 invoke 调用 ARC 下的 void 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com