Bugly 记录之前对
NSUserDefaults
有过synchronize
阻塞调用线程的疑问,但没注意到其读取也是会导致卡顿的
一、卡顿原因
- 当
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
});
});
三、另外对于
NSUserDefaults
中synchronize
的方法也注意下用法:
-
NSUserDefaults
是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,才直接使用synchronize
强制立即将数据写入磁盘的。 - 所以用
synchronize
的时候,注意下目的,不是立即要写入的,就没必要的,毕竟是阻塞当前线程的。 - 另外官方文档中已经表明
synchronize
已被弃用,并将在未来的版本中被标记为API_DEPRECATED
宏.
因此对于
NSUserDefault
,既要要注意其底层实现中存在直接或者间接的跨进程通信,在主线程同步调用容易发生卡死; 也注意synchronize
已被弃用。
网友评论