本文小编为大家详细介绍“NSMutable对象的坑如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“NSMutable对象的坑如何解决”免费云主机域名文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。最近处理了两个崩溃,都是在 NSMutableSet
调用 enumerateObjectsWithOptions
的时候发生的,崩溃类型悬垂指针。 查看崩溃堆栈里面的业务代码,发现 set
有 removeObject
和 addObject
的操作,按照经验来讲这大概率是一个多线程操作 set
造成的。最开始怀疑的是 removeObject
导致遍历的时候访问到了 release
的 obj
对象。但是当保证 removeObject
和 enumerateObjectsWithOptions
在同一个 queue
执行的时候崩溃仍然存在。尝试暴力复现,测试 addObject
和 enumerateObjectsWithOptions
是否存在多线程访问的问题。复现了崩溃,非法地址访问,崩溃地址 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点击事件的写法有哪些”吧! 写法:1、用“onClick={this.handleClick}”;2、用…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。