iOS 11发布后Fabric中出现reachPerformAndUnlock崩溃求助
针对你遇到的这个reachPerformAndUnlock崩溃问题,我结合iOS开发中常见的SystemConfiguration组件崩溃场景,整理了问题梳理和排查方向:
问题背景
自iOS 11正式发布后,我通过Fabric平台持续监测到SystemConfiguration组件的reachPerformAndUnlock崩溃问题,目前暂时无法定位具体崩溃原因。
崩溃堆栈跟踪
Crashed: com.apple.main-thread 0 libobjc.A.dylib 0x180d78910 objc_msgSend + 16 1 SystemConfiguration 0x1828fd644 reachPerformAndUnlock + 540 2 CoreFoundation 0x181b53404 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 3 CoreFoundation 0x181b52c2c __CFRunLoopDoSources0 + 276 4 CoreFoundation 0x181b5079c __CFRunLoopRun + 1204 5 CoreFoundation 0x181a70da8 CFRunLoopRunSpecific + 552
排查思路建议
从堆栈里的objc_msgSend崩溃来看,大概率是野指针访问导致的,结合reachPerformAndUnlock是SystemConfiguration中处理网络可达性回调的方法,给你几个排查方向:
- 检查
SCNetworkReachability相关对象的生命周期:如果你自己实现了网络可达性监听,要确认注册监听的对象(比如回调的target)是否在回调触发前被提前释放了。比如在ViewController的dealloc里有没有移除监听?如果target变成僵尸对象,系统回调时就会触发objc_msgSend崩溃。 - 排查第三方库的冲突:如果你的项目里引入了处理网络状态的第三方库(比如AFNetworking的可达性模块),要确认是否存在多个地方同时注册
SCNetworkReachability监听,导致回调逻辑混乱,甚至出现对象释放异常。 - 尝试复现并使用调试工具:可以在Xcode中开启Zombie Objects检测(Edit Scheme -> Diagnostics -> 勾选Zombie Objects),然后模拟网络切换、APP前后台切换等场景,捕捉崩溃时的具体对象信息,帮助定位是哪个对象被非法访问。
- 检查iOS版本适配:这个崩溃从iOS 11开始出现,要确认你的代码中针对iOS 11及以上版本的
SystemConfigurationAPI使用是否有变化,比如某些API在iOS 11后被废弃或者行为改变,导致监听逻辑异常。
内容的提问来源于stack exchange,提问作者stonycis
相关产品推荐
相关产品推荐

