NSMutable对象的坑如何解决


本文小编为大家详细介绍“NSMutable对象的坑如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“NSMutable对象的坑如何解决”免费云主机域名文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。最近处理了两个崩溃,都是在 NSMutableSet 调用 enumerateObjectsWithOptions 的时候发生的,崩溃类型悬垂指针。 查看崩溃堆栈里面的业务代码,发现 setremoveObjectaddObject 的操作,按照经验来讲这大概率是一个多线程操作 set 造成的。最开始怀疑的是 removeObject 导致遍历的时候访问到了 releaseobj 对象。但是当保证 removeObjectenumerateObjectsWithOptions 在同一个 queue 执行的时候崩溃仍然存在。尝试暴力复现,测试 addObjectenumerateObjectsWithOptions 是否存在多线程访问的问题。复现了崩溃,非法地址访问,崩溃地址 0x14ff1f228崩溃时的汇编指令和 x22 寄存器相关。再次执行测试代码,断点到崩溃地址 0x18a6cb26c,此时 x22 的值 0x0000000280567d00_set 的地址 0x0000000280098560。memory read _set:x22 这个值在 _set + 0x10 的位置。对 _set + 0x10 处添加内存断点查看修改这个值的逻辑。内存断点发现 set 在执行 addObject 可能会触发 __rehashs 方法,__rehashs 会修改 _set + 0x10 处的值。__rehashs 修改 _set + 0x10 上方 0x18a64a568 处有一次 free 的操作:再次运行测试代码,查看 free 的值,断点到 0x18a64a568:可以看到 free 的 x22 的值,也是 _set + 0x10 位置的值。打印 OBJC_CLASS$___NSSetM 的 ivars,offset == 0x10 的位置是 storage这个 type 略长,没有分析具体的类型,但是根据 xcode debug 的信息,可以得知 storage 存储了一个指针,指针指向存储 set item 的数组,这个字段的含义也就比较容易理解了。读到这里,这篇“NSMutable对象的坑如何解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: react点击事件的写法有哪些

这篇文章主要讲解了“react点击事件的写法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react点击事件的写法有哪些”吧! 写法:1、用“onClick={this.handleClick}”;2、用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/16 15:42
下一篇 05/16 15:42

相关推荐