iOS技术文章iOS进阶

CMFormatDescriptionRef引起的内存问题

2016-07-13  本文已影响426人  熊皮皮

本文档记录了一个因粗心导致App崩溃问题。最后确认原因是,不能CFRelease(CMFormatDescription),因为是从AVAsset中获取的而非拷贝而来。

这是一个功能模块,在workspace中用脚本把真机及模拟器两个版本打包成Framework给他人调用,运行期间报错如下图所示。

原始崩溃堆栈

Xcode停留在objc_msgSend,提示EXC_BAD_ACCESS。显然,这是错误操作内存引起的。在Xcode 7.x阶段,多数人第一反应是勾上Enable Address Sanitizer,同时Scheme改为Debug模式。是的,Framework及其调用Demo都改成Debug模式,后续都执行了这个操作。

启用Enable Address Sanitizer

然而,启用后编译运行,没变化,还是只有简洁的EXC_BAD_ACCESS提示,无多余信息。继续配置Address Sanitizer,在Build Settings -> Other C Flags加上数据溢出时系统的行为,如下所示。

Sanitize配置

编译运行,问题依旧没改观,如下图所示。

Sanitize配置后的错误提示

按老办法,在Demo项目中启用Enable Zombie Objects,编译运行,出现一则有用的信息:野指针。

野指针错误

查看项目输出的日志,发现如下内容。

CMFormatDescriptionRef

那么,崩溃问题由CMFormatDescriptionRef引起。此时,调用栈所下所示,只是停留在消息转发时崩溃,信息量有限。

启用僵尸对象的调用栈

另外,在此问题的排错上,enable Address SanitizerEnable Zombie Objects同时启用与Enable Zombie Objects单独启用,表现行为一样。

上一篇下一篇

猜你喜欢

热点阅读