iOS应用启动时Xcode控制台报NSMapGet空映射表错误排查
问题原因与解决办法
错误本质
在viewDidLoad中调用textView.becomeFirstResponder()时,textView的视图层级还未完全初始化完成,UIKit内部用于管理文本输入状态的NSMapTable实例尚未创建。此时触发第一响应者切换,UIKit会尝试访问这个空的映射表,从而抛出void * _Nullable NSMapGet(NSMapTable * _Nonnull, const void * _Nullable): map table argument is NULL错误。同时UIKit内部需要处理这个异常状态,导致界面出现2-3秒的冻结。
解决办法
把textView.becomeFirstResponder()的调用时机从viewDidLoad移到viewDidAppear(_:)方法中:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) textView.becomeFirstResponder() }
viewDidAppear阶段,视图已经完成渲染、添加到窗口,所有内部资源也完成了初始化,此时调用第一响应者切换不会触发空映射表的访问问题。
额外说明
如果使用自定义UITextView子类,要检查是否重写了becomeFirstResponder()或相关输入管理方法,避免提前触发依赖内部未初始化资源的逻辑。
内容的提问来源于stack exchange,提问作者Spiderus
相关产品推荐
相关产品推荐

