• NSUserDefault的使用


    1、NSUserDefault的使用:

    作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口。NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。

    原理:NsUserDefault是用户轻量级的数据持久化,主要用于保存用户程序的配置等信息,以便下次启动程序后能恢复上次的设置。因为是写到了硬盘上,所以会出现用多了会造成系统浪费,内存占用过大等问题。

    (1)、该数据实际上是以“键值对”形式保存的(类似于NSDictionary),因此我们需要通过key来读取或者保存数据(value)。

    (2)、NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如floats,doubles,intergers,Booleans,URLs。所以这也就是说我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary(目前有五种类型)这些实例。如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。

          (3)、从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。例如你使用mutable string做为“MyStringDefault”的值,当你做使用stringForKey:方法获取的值,这个值仍然是不可变的。

        (4)、NSUserDefaults是单例,同时也是线程安全的

    语法:

    存储整型的例子:

    1、获取一个NSUserDefaults引用:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    2、保存数据

    [userDefaults setInteger:1 forKey:@"segment"];

     

    [userDefaults synchronize];

    3、读取数据

    int i = [userDefaults integerForKey:@"segment"];

    存储其他数据类型的例子:

    保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。

     

    NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];

    [[NSUserDefaults standardUserDefaults]setObject:objColor forKey:@"myColor"];

     

    读取数据:

     

    NSData *objColor = [[NSUserDefaults standardUserDefaults]objectForKey:@"myColor"];

     

    UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];

    2、NSUserDefault的使用小技巧:

    (1)、NSUserDefault保存的数据在程序没有关闭前能成功读取到,但是当应用程序重启之后,就无法读取到,原因就是数据没有即时写入。通过官方文档可以了解到,UserDefaults是根据时间戳定时的把缓存中的数据写入本地磁盘,而非即时写入。所以调用set方法之后数据有可能还没有写入磁盘,应用程序就已经终止了。保险期间,我们在对重要的数据保存时使用synchornize方法强制写入。但是也要注意,不用频繁的使用synchornize。

     

    (2)、在使用NSUserDefault的时候,很多人以为

    [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"testInfo"] ;

    后就已经算存储好了,再通过

    [[NSUserDefaults standardUserDefaults] objectForKey:@"testInfo"];

    就可以取出刚刚存的数据。

     

    其实正常情况下没有问题,但是当重起

    程序,关键字testInfo对应的竟然是空,这是什么情况呢??

     

    我看看NSUserDefaults的头文件,就会发现,其实还有另外一个方法:synchronize,数据即时写入。

     

    如果我们在set后,执行下面的语句:

    [[NSUserDefaults standardUserDefaults] synchronize]; 

    那么就不会出现上面的取出数据为空的情况了。

     

    完整代码如下:

    //存入数据

    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];

    [defaults setObject:@"111" forKey:@"t

    est"];

    //把数据写到硬盘上

    [defaults synchronize];

     

    //取出数据

    NSString *testStr =[defaults objectForKey:@"test"];

    NSLog(@"testStr is: %@",testStr);

    3、NSUserDefault的一些实际使用:

    在使用NSUserDefaults的时候,

    先看下下面的代码

    NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];

    NSLog(@"Defaults: %@", defaults);

    是用来获取设备上的所有的NSUserDefaults的设置。

    上面代码输出了

    Defaults: {

        AppleITunesStoreItemKinds =     (

            eBook,

            document,

            "software-update",

            booklet,

            "itunes-u",

            newsstand,

            artist,

            podcast,

            "podcast-episode",

            software

        );

        AppleKeyboards =     (

            "zh_Hans-Pinyin@sw=Pinyin;hw=US",

            "en_US@hw=US;sw=QWERTY"

        );

        AppleKeyboardsExpanded = 1;

        AppleLanguages =     (

            "zh-Hans",

            en,

            fr,

            de,

            ja,

            nl,

            it,

            es,

            pt,

            "pt-PT",

            da,

            fi,

            nb,

            sv,

            ko,

            "zh-Hant",

            ru,

            pl,

            tr,

            uk,

            ar,

            hr,

            cs,

            el,

            he,

            ro,

            sk,

            th,

            id,

            "en-GB",

            ca,

            hu,

            vi

        );

    如果想单独看某个key的设置,例如:

    NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleKeyboards"];

    NSLog(@"Keyboards: %@", array);

    会输出

        AppleKeyboards =     (

            "zh_Hans-Pinyin@sw=Pinyin;hw=US",

            "en_US@hw=US;sw=QWERTY"

        );

    在看下面的代码

    if([[NSUserDefaults standardUserDefaults] objectForKey:@"message"]==nil){

              [[NSUserDefaults standardUserDefaults] setObject:@"This_is_my_default_message" forKey:@"message"];

    }

    代码意思是判断NSUserDefaults的“message”key 在dictionaryRepresentation中是否存在,如果不存在就

    设置“message”key为This_is_my_default_message。

    在加上句[[NSUserDefaults standardUserDefaults] synchronize];,这样这个设置就存到默认参数中了。

     

    也见过别人把默认参数的设置写到applicationDidFinishLaunching注册的,

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    {

         NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys:

                                       @"This_is_my_default_message", @"message", 

                                       nil];

     

        [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];

        [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaultValues];

    }

    当然写到applicationDidFinishLaunching中注册和不写到里面效果是一样的,只是代码的优美问题。

  • 相关阅读:
    #152: 有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。
    将博客搬至CSDN
    poj 2446 二分图最大匹配
    poj 2226 二分图最大匹配
    poj 3041 二分图最大匹配
    hdu 1054 二分图最大匹配
    二分图资料
    POJ 1469 二分图最大匹配
    hdu 5791 Two dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/zxykit/p/5329105.html
Copyright © 2020-2023  润新知