zoukankan      html  css  js  c++  java
  • NSUserDefaults的一些用法

    NSUserDefaults是一个单例,整个程序中只有一个实例化对象。
    NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL。
    不支持自定义的Model类型。
    如保存一个NSString的数据,可以用

    NSString *passWord = @"123456";
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:passWord forKey:@"userPassWord"];

    读取数据时,用

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSString *passWord = [user objectForKey:@"userPassWord"];

    需要注意的是,对于相同key的多次赋值,相当于多次覆盖,所以要保证key的唯一性。

    NSUserDefaults存储的对象全是不可变的。如想存储NSMutableArray的数据时,必须先创建一个不可变数组NSArray,再将它存入NSUserDefaults。如:

    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
    NSArray * array = [NSArray arrayWithArray:mutableArray];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"存储的一定是不可变的"]; 

    读取数据时,可以用NSUserDefaults对可变数组赋值。但要注意

    /*-------------------------错误的赋值方法-------------------*/
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    //这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug
    NSMutableArray *mutableArray = [user objectForKey:@"存储的一定是不可变的"];

    正确的做法为:

    /*-------------------------正确的赋值方法-------------------*/
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    //可以用alloc 方法代替
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"存储的一定是不可变的"]];

    在存储自定义Model时,往往一个对象有多个属性,如User有name,age,sex等属性。但NSUserDefaults不支持自定义Model,需要先将其转化为NSData。如:
    先建个User类,

    @interface User:NSObject
    @property(nonatomic,copy) NSString *name;
    @property(nonatomic,copy) NSString *age;
    @end

    若要将User转化为NSData,就需要遵守NSCoding协议 ,在.m中实现encodeWithCoder和
    initWithCoder方法。
    所以修改如下:

    @interface User:NSObject<NSCoding>
    @property(nonatomic,copy) NSString *name;
    @property(nonatomic,copy) NSString *age;
    @end

    在.m中

    @implementation User
    -(void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeObject:self.age forKey:@"age"];
    }
    
    -(id)initWithCoder:(NSCoder *) aDecoder{
        if(self = [super init]){
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeObjectForKey:@"age"];
        }
        return self;
    }
    
    @end

    然后将自定义类型存入NSUserDefaults中,可以建一个NSMutableArray存储所有的User。

    User *user = [[User alloc] ini];
    //下面进行的是对user对象的 name ,age的赋值
    user.name = @"somebody";
    user.age = @"12";
    //这是一个存放所有用户的数组
    NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
    //将user类型变为NSData类型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
    //存放数据的数组将data加入进去    
    [dataArray addObject:data];

    若只想存储一个人的信息,可以直接将NSData存入NSUserDefaults中

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];   
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    [userDefault setObject:data forKey:@"oneUser"];

    从NSData中还原数据也很简单,如

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSdData *data = [user objectForKey:@"oneUser"];
    User *user = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  • 相关阅读:
    bootstrap之CDN
    bootstrap之HTML模板
    Glyphicon 字体图标
    crawler4j 学习(二)
    【软件构造】第二章 软件构建的过程和工具(2)
    【软件构造】第二章 软件构建的过程和工具(1)
    【软件构造】第一章 软件构造基础(2)
    【软件构造】第一章 软件构造基础(1)
    机器学习技法笔记-Lecture 1 Linear support vector machine
    机器学习基石笔记-Lecture 15 Validation
  • 原文地址:https://www.cnblogs.com/Apologize/p/4564153.html
Copyright © 2011-2022 走看看