iOS 数据持久化之-NSUserDefaults

NSuserDefaults在iOS中特别适合于存储轻量级数据,比如用户和密码,是否已登录标志,mjrefresh的记录上次刷新时间等。

NSuserDefaults可以存储的数据类型有:NSNumber、NSString、NSDictionary、NSArray、NSData、NDDate基本覆盖了常用的数据类型,以下是它们使用的例子:

    //NSNumber

    [[NSUserDefaultsstandardUserDefaults]setObject:@(123)forKey:@"number"];

    NSNumber *valueNumber = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"number"];

    

    //NString

    [[NSUserDefaultsstandardUserDefaults]setObject:@"hey"forKey:@"string"];

    NSString *valueString = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"string"];

    

    //NSDictory

    NSDictionary *dic =@{@"dicKey":@"dicValue"};

    [[NSUserDefaultsstandardUserDefaults]setObject:dicforKey:@"dic"];

    NSDictionary *dicData = [[NSUserDefaultsstandardUserDefaults]valueForKey:@"dic"];

    

    //NSMutableDictionary

    NSMutableDictionary *mutableDic = [NSMutableDictionarydictionary];

    [mutableDic addEntriesFromDictionary:@{@"qwertyu":@"qwertyyu"}];

    [[NSUserDefaultsstandardUserDefaults]setObject:mutableDicforKey:@"mutableDic"];

    NSDictionary *mutData = [[NSUserDefaultsstandardUserDefaults]valueForKey:@"mutableDic"];

    

    //NSArray

    NSArray *array =@[@"1",@"2",@"3"];

    [[NSUserDefaultsstandardUserDefaults]setObject:arrayforKey:@"array"];

    NSArray *arrayData = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"array"];

是不是非常的简便!


有时候我们想保存自定义的数据类型,比如保存:账号、密码、上次登录时间。

@interface UserLoginInfo : NSObject 

@property (nonatomic,copy)NSString *name;

@property (nonatomic,copy)NSString *password;

@property (nonatomic,copy)NSString *loginDate;

@end

UserLoginInfo不属于NSuserDefaults可以保存的类型,这个时候就不能之间将UserLoginInfo存放到NSuserDefaults里了,需要我们自己将UserLoginInfo对象转化为可以存放的类型NSData类型,然后才能保存:

遵从NSCopying协议,并实现协议的编码和解码接口:

- (void)encodeWithCoder:(NSCoder *)aCoder;

- (nullableinstancetype)initWithCoder:(NSCoder *)aDecoder; 


还是上面保存:账号、密码、上次登录时间的例子:

@interface UserLoginInfo : NSObject <NSCopying>

@property (nonatomic,copy)NSString *name;

@property (nonatomic,copy)NSString *password;

@property (nonatomic,copy)NSString *loginDate;

@end


@implementation UserLoginInfo


- (void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.nameforKey:@"name"];

    [aCoder encodeObject:self.passwordforKey:@"password"];

    [aCoder encodeObject:self.loginDateforKey:@"loginDate"];

}


- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    if (self = [superinit]) {

        self.name = [aDecoderdecodeObjectForKey:@"name"];

        self.password = [aDecoderdecodeObjectForKey:@"password"];

        self.loginDate = [aDecoderdecodeObjectForKey:@"loginDate"];

    }

    

    returnself;

}


然后通过NSKeyedArchiver将UserLoginInfo转化为NSdata

    UserLoginInfo *loginInfo = [[UserLoginInfoalloc]init];

    loginInfo.name =@"gx_wqm";

    loginInfo.password =@"password";

    loginInfo.loginDate =@"2012-05-06 12: 34: 11";

    NSData *logData = [NSKeyedArchiverarchivedDataWithRootObject:loginInfo];                  //UserLoginInfo转化为NSdata

    [[NSUserDefaultsstandardUserDefaults]setObject:logDataforKey:@"loginInfo"];               //保存NSdata

    NSData *saveData = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"loginInfo"];//获取NSdata

    UserLoginInfo *aaaa = [NSKeyedUnarchiverunarchiveObjectWithData:saveData];              //将nsdata转化为UserLoginInfo


@end

也就是说我们遵从NSCopying协议是为了让NSKeyedArchiver知道如何对UserLoginInfo进行编码和解码(UserLoginInfo与NSdata的相互转化)。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值