You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:59:22