getReturnValue 获取对象Crash

发布于 2022-09-03 08:53:26 字数 797 浏览 31 评论 0

iOS反射使用【代码1】getReturnValue:获取OC对象,
在 iPhone4s+iOS8.4、iPhone4+iOS7.1(会崩),
iPhone6+iOS9.3、iPhone5+iOS8.4.1(不会蹦) ,
如果实现下面的【代码2】就在所有的系统上都不会崩溃,请问这是系统Bug还是什么?

下载测试Demo

// 代码1

id objcMinor;
    // 返回值是 Objc
    if( !strcmp(minorReturnType, @encode (id)) ) {
        [invoMinor getReturnValue:&objcMinor];
    } 

// 代码2

//  void *temp = NULL;
//  [objcMinor getReturnValue:&temp];
//   id objcMinor  = (__bridge id)temp; 

可以结合测试Demo里面的代码看看,下面截图的崩溃调用栈。

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花伊自在美 2022-09-10 08:53:26
  • 是个内存泄露问题,你把edit scheme->run->enable Zombile objects勾选,在控制台会输出

*** -[CFNumber release]: message sent to deallocated instance 0x7baa7460

看了下内存地址,就是objcMajor这个对象。

  • 造成这个的原因难查,我先把这个告诉你,你也看下。奇怪的是

 [invoMajor setSelector:@selector(minor)];

掉这个方法不会有问题

巡山小妖精 2022-09-10 08:53:26

id objcMinor;
修改为 __autoreleasing id objcMinor; 就好了

关于void *和id的区别 以及ARC如何处理 可以参考这个链接 http://stackoverflow.com/ques...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文