• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:19:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在 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 中崩溃:

(void)method_invoke(目标,方法)

这里有更正确的方法吗?



Best Answer-推荐答案


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

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

所以,大致:

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

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap