NSUserDefaults

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];
NSDictionary
dic = @{@"name": @"张三"};
[user registerDefaults:dic];
}

参考文献:http://blog.csdn.net/sponge_cmz/article/details/49798931#1-nsuserdefaults保存数据的的存放位置及文件格式

你可能感兴趣的:(NSUserDefaults)