invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific

一,现象

  1. 在输入框输入文字的时候,程序突然崩溃,出现如题所示的崩溃日志,初步认定kCFRunLoopCommonModes的错误是定时器没关的问题.

  2. 仔细检查刚刚 pop 出的控制器中的定时器,在该控制器退出的时候,确实没有关闭定时器,因此会有输入内容的时候,定时器还在开启,此时定时器得等输入框的主线程执行完之后,才会执行定时器响应函数......

  3. 等到定时器下一次启动的时候,碰到上一次没有关闭的定时器,造成定时器阻塞.....进而崩溃.

二,比较常见的崩溃

(参考:https://gold.xitu.io/post/584b787f128fe10058a162cb?utm_source=gold_browser_extension)

1.对数组进行增删改操作

  • 在长连接里面对数组进行增删改操作(子线程),又在定时器里面对数组进行增删改操作(主线程),有可能会造成数组越界而崩溃.
  • (解决方案:使用@synchronized(<#token#>) { <#statements#>}锁防止同时操作数组,可以参考以上网址中的方案,
    1. 设置readonly属性,提供添加了锁的访问/设置方法;

    2. 函数中的 NSArray 或NSMutableArray使用前先 copy 到本地)

2. NSNotification

  • 在添加的时候,没有及时释放,导致通知重复添加.
  • 对于通知的名称,最好统一管理
  • 解决方案:
    1. init 中创建 ,dealloc 中移除(可以多次调用以下方法,不会有什么影响)

    2. 尽量不要在viewDidLoad中创建,内存警告时view是有可能unloaded再reloaded)

3. 子主线程处理UI事件

  • 给 UIView 设置数据的时候,崩溃或某些视图不显示.

  • 有可能是被子线程调用,进而造成某些视图不显示,因此要用
    dispatch_async(dispatch_get_main_queue(), ^{ })来包装一下.

你可能感兴趣的:(invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific)