NSUserDefaults是将数据保存在一个plist格式的文件中. 此plist文件路径为APP沙盒文件夹下/Library/Preferences/中
说明 :
NSUserDefaults可以存放的数据类型有 :
基本类型(float, double, intgeter等), NSString, NSArray, NSDictionary, NSData, NSNumber, BOOL, NSURL类型. 存取数据一般都是对持久域进行的数据操作(默认).
注意 :
1、在对NSUserDefaults进行取数据时,它的返回值是不可变的. 即使向NSUserDefaults中存放一个可变类型的对象时, 取出时会返回一个不可变对象
2、在向NSUserDefaults中存放数据时, 不要存放NSNull类型的数据, 否则会crash,所以当你向NSUserDefaults中存放数据之前最好判断你所存放的数据是否是NSNull类型的数据, 如果是可以将给类型数据转化为nil或者其他形式.
1、获取NSUserDefaults对象(系统中提供的单例)
+ (NSUserDefaults )standardUserDefaults/*
2、存取数据 .
- setObject:forKey:
- setInteger:forKey:
3、 立即同步 .
- (BOOL)synchronize
4、同步更改之后, 将UserDefaults对象从内存中删除, 之后随即调用standardUserDefaults, 再次获取userDefault对象
+ (void)resetStandardUserDefaults
5、 应用程序之间共享数据(当开发应用程序套件时)
- (instancetype)initWithSuiteName:(NSString )suitename
存取数据
- (void)addData
{
/* 返回(找到)单例 */
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
/** 保存各种类型数据 */
[userDefaults setObject:@"张三"forKey:@"name"];
[userDefaults setInteger:21forKey:@"age"];
[userDefaults setFloat:99.3forKey:@"score"];
[userDefaults setDouble:170.66forKey:@"height"];
[userDefaults setURL:[NSURL URLWithString:@"[email protected]"] forKey:@"email"];
NSArray *array = @[@"数学", @"语文", @"英语"];
[userDefaults setObject:array forKey:@"subject"];
NSDictionary *dic = @{@"父亲": @"张毅", @"母亲": @"刘岩"};
[userDefaults setObject:dic forKey:@"family"];/**
*系统也会周期性的调用此方法来为我们将数据存储到磁盘, 当你不想等待系统自动调用的话(比如app将要退出时, 或者你要立即更新数据时), 可以直接调用此方法.*/
[userDefaults synchronize];
/** 返回对应域中的所有键值对 */
NSLog(@"%@", [userDefaults dictionaryRepresentation]);
}
添加持久域:
1)、创建持久域会在 Library文件夹下的Perferences文件夹下生成plist文件, 且将存储的数据存放在磁盘中.
2)、持久域 : 其实持久域无非就是他的生命周期和app的生命周期相同, 只要你不卸载app的话, 持久域就会存在, 卸载app, 持久域才会随之消失.
- (void)createPersistentDomain
{
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
/** 创建字典, 用来存放用户的爱好 *
/NSDictionary *dic = @{@"ball": @"football", @"book": @"将夜"};
/** 添加持久域 */
[user setPersistentDomain:dic forName:@"hobby"];
/** 取出持久域 */
NSDictionary *dic1 = [user persistentDomainForName:@"hobby"];
NSLog(@"%@", dic1);
/** 删除持久域 */
[user removePersistentDomainForName:@"hobby"];
}
创建添加不稳定域
1)、不会生成plist文件, 且将数据存放在静态区
2)、不稳定域 : 在你不退出程序时, 是可以取出不稳定域的. 但当你退出程序再进入程序时上次创建的不稳定域将不存在了;这就是持久域与不稳定域的区别.
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
/** 创建一个字典 */
NSDictionary *volatileDic = @{@"name": @"zhangsan", @"age": @"17"};
/** 添加不稳定域 */
[user setVolatileDomain:volatileDic forName:@"violatile"];
/** 取出不稳定域 */
NSLog(@"第一页violatile: %@", [user volatileDomainForName:@"violatile"]);
/** 删除不稳定域 */
[user removeVolatileDomainForName:@"violatile"];
套件的创建及添加
套件的作用: 一个应用程序是不能访问或修改其他应用程序的偏好的.
当你在当前应用程序访问其他应用程序时, 系统读取数据的文件并不是被访问的应用程序的文件, 而是这个套件中的数据.套件就是在开发应用程序扩展时,在扩展和包含应用程序之间共享偏好或其他数据的.
/** 创建一个套件在Library目录下的Perferences文件夹下 */
NSUserDefaults *suite = [[NSUserDefaults alloc] initWithSuiteName:@"nihao"];
/** 同理可以利用这个方法来添加套件 */
- (void)addSuiteNamed:(NSString *)suiteName
/** 利用该方法删除套件 */
- (void)removeSuiteNamed:(NSString *)suiteName
注册域
注册域: 注册域的数据不会直接写入磁盘中.
- (void)registerDomain
{
NSUserDefaultsuser = [NSUserDefaultsstandardUserDefaults];
NSDictionarydic = @{@"name": @"张三"};
[user registerDefaults:dic];
}
参考文献:http://blog.csdn.net/sponge_cmz/article/details/49798931#1-nsuserdefaults保存数据的的存放位置及文件格式