欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

在iOS开发中关于NSUserDefaults的使用解析

程序员文章站 2022-05-01 17:42:13
ios开发中,用nsuserdefaults做本地化数据永久化存储时,会用到synchronize关键字,本章就来说说为什么要用synchronize关键字。 nsuserdefaults的使用比较...

ios开发中,用nsuserdefaults做本地化数据永久化存储时,会用到synchronize关键字,本章就来说说为什么要用synchronize关键字。

nsuserdefaults的使用比较简单,在这里只是简单提一下即可:nsuserdefaults *userdefaults = [nsuserdefaults standarduserdefaults];

nsuserdefaults是一个单例,创建nsuserdefault对象之后就可以往里面添加数据,它支持的数据类型有:nsstring、 nsnumber、nsdate、 nsarray、nsdictionary、bool、nsinteger、nsfloat等定义的数据类型,如果要存放自定义的对象(如图片、自定义的类对象等),则必须先将其转换成nsdata然后再进行存储;向nsuserdefaults里面添加数据后,这些数据就变成了全局的变量,app中即可读写nsuserdefaults中的数据;如果想删除某个存储的数据项,可以使用removeobjectforkey删除数据。

需要注意的是,nsuserdefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完nsuserdefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘。

一般情况下,不会在nsuserdefaults做数据存储的地方使用synchronize关键字,比如下图所示:

在iOS开发中关于NSUserDefaults的使用解析

一般只是在移除存储数据的地方才使用synchronize关键字,如下图所示:

在iOS开发中关于NSUserDefaults的使用解析

nsuserdefaults中的数据即被写入到.plist文件中,如果是在模拟器上运行,可以在mac电脑的/library/prefereces目录下面找到一个文件名为com.apple.plist的plist文件,用xcode打开该文件,可以看到写入的数据。

@synchronized,代表这个方法加锁, 相当于不管哪一个线程(eg:线程a),运行到这个方法时,都要检查有没有其它线程,例如线程b正在用这个方法,有的话要等正在使用synchronized方法的线程b运行完这个方法后再运行此线程a,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

@synchronized 方法控制对类(一般在ios中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,一直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)。

synchronized 块:

@通过 synchronized关键字来声明synchronized 块。语法如下:@synchronized(syncobject) { }

synchronized 块是这样一个代码块,其中的代码必须获得对象 syncobject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前面所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。