美文网首页
iOS NSUserDefaults 卡顿

iOS NSUserDefaults 卡顿

作者: 天空中的球 | 来源:发表于2021-04-29 11:08 被阅读0次

之前对 NSUserDefaults 有过synchronize阻塞调用线程的疑问,但没注意到其读取也是会导致卡顿的

Bugly 记录
一、卡顿原因
  • NSUserDefault 在系统低内存时会把内存中的数据进行置换,在执行的过程中会加锁,所以此时在主线程会导致长时间卡顿
  • NSUserDefaults实际上是在Library/Preferences文件夹下会生产一个plist文件,加载的时候是整个plist配置文件全部加载到内存中的,所以在一个地方大规模写入 NSUserDefaults 值也会造成卡顿的。
二、ToDo
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
    // NSUserDefaults
    dispatch_async(dispatch_get_main_queue(), ^{
        // DO TO 
    });
});
三、另外对于 NSUserDefaultssynchronize 的方法也注意下用法:
  • NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,才直接使用synchronize强制立即将数据写入磁盘的。
  • 所以用 synchronize 的时候,注意下目的,不是立即要写入的,就没必要的,毕竟是阻塞当前线程的。
  • 另外官方文档中已经表明 synchronize 已被弃用,并将在未来的版本中被标记为API_DEPRECATED宏.

因此对于 NSUserDefault,既要要注意其底层实现中存在直接或者间接的跨进程通信,在主线程同步调用容易发生卡死; 也注意 synchronize 已被弃用。

相关文章

网友评论

      本文标题:iOS NSUserDefaults 卡顿

      本文链接:https://www.haomeiwen.com/subject/qyiirltx.html