关于NSUserDefaults

作为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;

你可能感兴趣的:(关于NSUserDefaults)