zoukankan      html  css  js  c++  java
  • IOS数据存储之NSUserDefaults

    前言:

      作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下。

    NSUserDefaults简介:

               NSUserDefaults是一种存储轻量级的本地数据方式,NSUserDefaults是一个单例,主要用于数据的永久保存,简单实用。试用场景:比如我们保存一下用户的登录信息,一个标识等。支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL等系统定义的数据类型。上面标记红色是为了引起大家的注意,自己在写测试程序的时候写了一个NSMutableArray 然后保存,不幸的是直接挂掉,后来查了一下资料,原来NSUserDefaults 存储的对象全是不可变的!

    废话不多说写个测试程序看看:

    首先存储一个字符串NSString

       //NSUserDefaults 使用
        NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
        NSString *nameForSave =@"whoislcj";
        NSString *key=@"name";
        //保存数据
        [defaults setObject:nameForSave forKey:key];//根据键值对保存name
        //读取数据
        NSString *nameForGet = [defaults objectForKey:key];//根据键值取出name
        NSLog(@"nameForGet---%@",nameForGet);
        NSLog(@"nameForSave==nameForGet---%i",[nameForGet isEqualToString:nameForSave]);

    然后存储一个NSArray

        NSArray *myArray = [NSArray arrayWithObjects:@"who", @"islcj", nil];
        [defaults setObject:myArray forKey:@"testArray"];
         NSArray *myArray1 = [defaults arrayForKey:@"testArray"];
         NSLog(@"myArray---%@",myArray1);

    是不是很简单,其他的基础类型就不一一实现了。这个就在想既然是setObject那到底支持不支持自定义对象类型呢,所以写了个自定义对象

        Person *person1=[[Person alloc]init];
        person1.name=@"whoislcj";
        [defaults setObject:person1 forKey:@"person1"];
        Person *person2=[defaults objectForKey:@"person1"];
        NSLog(@"person2---%@",person2.name);

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject<NSCoding>
    
    @property (nonatomic,strong)NSString *name;
    
    @end

    Person.m

    #import "Person.h"
    
    @implementation Person
    
    #pragma mark - NSCoding Delegate
    
    -(id)init{
        if(self==nil){
            self =[super init];
        }
        return self;
    }
    
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super init];
        if (self)
        {
            self.name = [aDecoder decodeObjectForKey:@"name"];
        }
        return self;
    }
    
    @end

    运行结果:不幸的事情发生了 ,直接挂掉了,后来查了一下资料NSUserDefaults 本身不支持自定义对象的存储!那怎么办呢,方法就有很多种了,

    第一种自定义对象转化成Json字符串存储,第二种自定义对象转化成NSData数据。

    用过SharedPreferences都知道commit和apply函数,所有想想ios这边会不会也有这样的考虑,所以查阅一番原来也是一样的,仅仅调用[defaults

    setObject: forKey:]之后NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘,具体代码如下:

    //这里建议同步存储到磁盘中,但是不是必须的  
     [defaults synchronize];  

    接下来又想起来之前用SharedPreferences的数据清除了,那么NSUserDefaults怎么清楚数据的呢?

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    
    [[NSUserDefaults standardUserDefaults] synchronize];

    值得注意是:

    用过SharedPreferences的都知道它的保存方式是一个xml文件而且是明文的,其实NSUserDefaults在iOS沙盒中也是一个.plist文件而且也是没有加密的,所以对安全性要求的数据最好经过加密之后再存储。

  • 相关阅读:
    kafka集群搭建
    更改:把redis替换成kafka
    mysql+canal+kafka+elasticsearch构建数据查询平台
    zookeeper集群搭建
    另类--kafka集群中jmx端口设置
    kafka集群中jmx端口设置
    使用zookeeper报错 stat is not executed because it is not in the whitelist. envi is not executed because it is not in the whitelist.
    使用python的kazoo模块连接zookeeper实现最基本的增删改查
    Maven之阿里云镜像仓库配置
    通过yum安装maven
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5479019.html
Copyright © 2011-2022 走看看