_UIKeyboardBasedNonEditableTextSelectionGestureCluster oneFingerForcePress: Swift崩溃原因排查
分析iOS键盘相关崩溃日志的可能原因
我来帮你拆解这份崩溃日志,先看你提供的崩溃栈:
0 libobjc.A.dylib 0x00000001807f4430 objc_msgSend + 16 1 UIKit 0x000000018afad990 -[_UIKeyboardBasedNonEditableTextSelectionGestureCluster oneFingerForcePress:] + 76 (_UIKeyboardTextSelectionGestureController.m:2076) 2 UIKit 0x000000018b060134 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 64 (UIGestureRecognizer.m:105) 3 UIKit 0x000000018b064698 _UIGestureRecognizerSendTargetActions + 124 (UIGestureRecognizer.m:1128) 4 UIKit 0x000000018b064514 -[UIGestureRecognizer _forceLevelClassifier:currentForceLevelDidChange:] + 360 (UIGestureRecognizer.m:1736) 5 UIKit 0x000000018aedb538 -[_UIForceLevelClassifier setCurrentForceLevel:] + 108 (_UIForceLevelClassifier.m:69) 6 UIKit 0x000000018b5911a8 -[_UILinearForceLevelClassifier observeTouchWithForceValue:atTimestamp:withCentroidAtLocation:] + 160 (_UILinearForceLevelClassifier.m:162) 7 UIKit 0x000000018aedb7a4 __48-[_UIForceLevelClassifier receiveObservedValue:]_block_invoke + 160 (_UIForceLevelClassifier.m:87) 8 UIKit 0x000000018b06e9d0 -[_UITouchForceMessage ifObservation:ifReset:] + 304 (_UITouchForceMessage.m:60) 9 UIKit 0x000000018aedb6ac -[_UIForceLevelClassifier receiveObservedValue:] + 288 (_UIForceLevelClassifier.m:93) 10 Foundation 0x00000001820c50a4 -[_NSObserverList _receiveBox:] + 572 (NSObservedValue.h:53)
从栈顶的objc_msgSend +16可以确定,这是典型的野指针崩溃——也就是给一个已经被释放的对象发送了消息。结合整个调用链,崩溃和系统针对非可编辑文本的键盘选择手势(尤其是3D Touch压力手势)强相关,下面是几个最可能的原因:
- 手势集群对象或关联控件提前释放:崩溃触发在
_UIKeyboardBasedNonEditableTextSelectionGestureCluster的oneFingerForcePress:方法里,大概率是这个手势集群对象本身,或者它绑定的非可编辑文本控件(比如UILabel)已经被销毁,但系统的手势回调还在队列中等待执行,导致发送消息到僵尸对象上。 - 自定义手势与系统手势冲突:如果你的App给非可编辑文本控件添加了自定义手势(比如长按、按压手势),或者修改了控件的
userInteractionEnabled等交互属性,可能会干扰系统这个手势集群的内部状态,引发对象生命周期异常。 - ARC下的内存管理疏漏:虽然ARC自动管理内存,但如果在处理这类文本控件时,手势识别器的target被错误地强引用,或者在控件释放时没有及时移除关联的系统手势,就会出现这种“对象已死但回调还在”的情况。
- 特定系统版本的bug:这个崩溃涉及的
_UIForceLevelClassifier是处理3D Touch压力等级的类,在某些iOS版本(比如iOS 13到iOS 15的过渡版本)中,系统可能存在内部对象管理的bug,导致在特定操作下触发野指针。
给你几个排查的方向:
- 打开Xcode的Zombie Objects检测(Edit Scheme → Diagnostics → Enable Zombie Objects),尝试在类似场景下模拟操作(比如快速切换包含非可编辑文本的页面、在文本上用力按压),看是否能复现并定位到具体的僵尸对象。
- 检查App中所有非可编辑文本控件的自定义逻辑,有没有修改过它们的交互行为、添加额外手势,或者在页面销毁时有没有正确清理相关控件。
- 统计崩溃发生的设备和系统版本,如果集中在某个特定iOS版本,可以考虑针对性兼容,比如通过runtime禁用非可编辑文本的3D Touch手势。
- 用Instruments的Leaks工具排查内存问题,看看是否存在相关对象的异常释放或循环引用情况。
内容的提问来源于stack exchange,提问作者gadiraju rekha
相关产品推荐
相关产品推荐

