• 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中注册和不写到里面效果是一样的,只是代码的优美问题。

  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/zxykit/p/5329105.html
Copyright © 2020-2023  润新知