作为iOS重要的数据持久化技术之一,相信很多人都用过NSUserDefaults ,原因无他,实在太好用了,我曾见过有人用它来做正向传值的 ==!
1.NSUserDefaults适合保存用户配置信息。
2.NSUserDefaults能保存的数据类型有string、array、dictionary、data、url、integer、float、double、BOOL等数据类型。
3.NSUserDefaults里的信息以plist文件存储在沙盒中,具体存在/Library/Preferences中
初始化:
NSUserDefaults有四个初始化方法:一个类方法,三个对象方法。
1. + (NSUserDefaults*)standardUserDefaults;//系统推荐的初始化方法。
2.- (instancetype)init;//效果和standarUserDefaults一样。
3.- (nullableinstancetype)initWithSuiteName:(nullableNSString*)suitenameNS_AVAILABLE(10_9,7_0)NS_DESIGNATED_INITIALIZER;//这个方法要传入一个字符串,待会再讲
4.- (nullableid)initWithUser:(NSString*)usernameNS_DEPRECATED(10_0,10_9,2_0,7_0);//这个方法在ios7.0之后已经被弃用了,目前这个方法貌似无用。
NSUserDefaults会将开发者存入它里面的信息以plist文件的形式写入到沙盒中。第一个和第二个方法初始化生成的plist文件的名称以这样的规律命名:(bundle identifier).(项目名).plist!
第三个方法比较有意思,它会以传进来的字符串xxxx为名字创建一个plist文件:xxxx.plist!
第四个方法不知道有没有用,我没试成功。
需要注意的是:在用上面的三个方法初始化成功之后,在setValue:forkey: 之前,你的/Library/Preferences中是没有那个“应该”出现的plist文件的,不信的可以去使一下,就初始化,但是不赋值。
然后就是各种赋值和读取的方法,太简单了,不介绍。
各种有点难以理解的方法:
1.+ (void)resetStandardUserDefaults;
//这个方法是在第一个初始化的类方法之后的,看字面意思应该重置userDefault(但是貌似没起作用,有知道的求告知)
2.- (void)registerDefaults:(NSDictionary *)registrationDictionary;
//将一个指定字典的内容添加到注册域(应该是NSRegistrationDomain)。如果不存在注册域,则用指定的字典创建一个,然后NSRegistrationDomain会被添加到搜索列表(?)中。注册域中的内容是不会写入到沙盒中的,你需要在程序启动的时候手动调用它,或者你可以将它写入到plist文件中保存起来,然后调用registerDefaults:就传入你读取到的文件内容。(这里应该是和下面系统默认创建的两个域一样,默认是在内存中的。)
3.- (void)addSuiteNamed:(NSString*)suiteName;
- (void)removeSuiteNamed:(NSString*)suiteName;
//插入一个指定的域名到接收者的搜索列表。这个指定的域名类似于bundle identifier,但不是必须和应用包绑定的。一个suite可以用来保存首选项,进行多个应用之间的通信。//从接受者的搜索列表中删除一个指定的域名。
4.@property(readonly,copy)NSArray *volatileDomainNames;
//这个属性返回的是不稳定的域(这里应该是指只存储在内存中的NSUserDefaults对象,但没有写入沙盒,是程序默认创建的)的名字(也就是NSUserDefaults上面公开的三个字符串中的两个)NSArgumentDomain和NSRegistrationDomain
FOUNDATION_EXPORTNSString*const NSGlobalDomain;//这个不在arr中,就是说这个是稳定的?(后面也没找到以这个命名的域)
5.- (NSDictionary *)volatileDomainForName:(NSString*)domainName;
然后利用这个方法打印上面那个volatileDomainNames,发现NSArgumentDomain的域里是没有内容的,NSRegistrationDomain里是些系统配置,内容为:
dic={
AppleLanguages = (
"zh-Hans-CN",
"en-CN",
en
);
NSInterfaceStyle = macintosh;
NSLanguages = (
"zh-Hans-CN",
"en-CN",
en
);
}
6.- (void)setVolatileDomain:(NSDictionary *)domain forName:(NSString*)domainName;
- (void)removeVolatileDomainForName:(NSString*)domainName;
往下看,有个数组,返回的是稳定的域(这里应该是指持久化的),打印出来发现都是我创建出来的plist文件!!所以,NSUserDefaults里的域应该是NSUserDefaults对象的存储空间!下面是打印的信息:
arr=(
xxxhuaMiss,
xxxhua,
“www.pxh.com.testNSUerDefaults”,
llla
)
7.- (NSArray*)persistentDomainNamesNS_DEPRECATED(10_0,10_9,2_0,7_0);
8.- (nullableNSDictionary *)persistentDomainForName:(NSString*)domainName;
- (void)setPersistentDomain:(NSDictionary*)domain forName:(NSString*)domainName;
- (void)removePersistentDomainForName:(NSString*)domainName;
9.- (BOOL)synchronize;
//将信息同步的方法,避免因为程序异常退出而导致信息保存失败的意外。
10.- (BOOL)objectIsForcedForKey:(NSString*)key;
- (BOOL)objectIsForcedForKey:(NSString*)key inDomain:(NSString*)domain;