Swift:闭包调用引发EXC_BAD_ACCESS,简化复现触发栈溢出
Swift闭包引发栈溢出(EXC_BAD_ACCESS code=2)问题分析
问题背景
最开始我是在闭包数组的场景下遇到了EXC_BAD_ACCESS code=2错误,为了搞清楚问题根源,我把代码精简到了最少行数(只用来演示问题本身)。
简化后的复现方式
在提示下,我找到了不需要依赖数组的更简单复现方法:运行对应的简化代码就能直接触发栈溢出。
报错原因拆解
EXC_BAD_ACCESS code=2对应的是栈溢出错误,结合闭包场景来看,大概率是因为闭包形成了循环引用+递归调用:
- 如果闭包内部直接或间接调用了自身,同时没有通过
weak/unowned打破循环引用,就会不断生成新的栈帧; - 当栈帧的数量超过系统分配的栈空间上限时,就会触发这个访问错误。
后续动作
目前我已经准备好向Swift官方提交Bug报告,会把精简后的复现代码、问题场景和报错详情整理后反馈给官方团队。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

