NSUserDefaults写入和读取自定义类
转载请注明:http://blog.youkuaiyun.com/l863784757/article/details/45538599
NSUserDefaults可以存取一些短小的信息,例如:NSString, NSNumber, NSDate, NSArray, NSDictionary.
- //存
- NSString *string = [NSString stringWithString @“test"];
- NSUserDefaults *userD = [NSUserDefaults standardUserDefaults];
- [userD setObject:string forKey:@“testKey"];
- //取
- NSString *value;
- value = [userD objectForKey:@“testKey”];
但是如果想存一个自定义的NSObject对象,可以让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。
例如我们常用的用来存用户登录信息的类
UserModel.h文件
- #import <Foundation/Foundation.h>
- @interface UserModel : NSObject<NSCoding>
- @property(nonatomic, strong) NSNumber *score;
- @property(nonatomic, strong) NSNumber *level;
- @property(nonatomic, strong) NSString *name;
- @property(nonatomic, strong) NSString *avatar;
- @property(nonatomic, strong) NSNumber *com;
- @property(nonatomic, strong) NSNumber *mes;
- @end
UserModel.m文件
- #import "UserModel.h"
- #define EC_USER_score @"EC_USER_score"
- #define EC_USER_level @"EC_USER_level"
- #define EC_USER_name @"EC_USER_name"
- #define EC_USER_avatar @"EC_USER_avatar"
- #define EC_USER_com @"EC_USER_com"
- #define EC_USER_mes @"EC_USER_mes"
- @implementation UserModel
- -(void)encodeWithCoder:(NSCoder *)aCoder{
- [aCoder encodeObject:self.score forKey:EC_USER_score];
- [aCoder encodeObject:self.level forKey:EC_USER_level];
- [aCoder encodeObject:self.name forKey:EC_USER_name];
- [aCoder encodeObject:self.avatar forKey:EC_USER_avatar];
- [aCoder encodeObject:self.com forKey:EC_USER_com];
- [aCoder encodeObject:self.mes forKey:EC_USER_mes];
- }
- -(id)initWithCoder:(NSCoder *)aDecoder{
- self = [super init];
- if (self) {
- if (aDecoder == nil) {
- return self;
- }
- self.score = [aDecoder decodeObjectForKey:EC_USER_score];
- self.level = [aDecoder decodeObjectForKey:EC_USER_level];
- self.name = [aDecoder decodeObjectForKey:EC_USER_name];
- self.avatar = [aDecoder decodeObjectForKey:EC_USER_avatar];
- self.com = [aDecoder decodeObjectForKey:EC_USER_com];
- self.mes = [aDecoder decodeObjectForKey:EC_USER_mes];
- }
- return self;
- }
- @end
存取:
//[self getUserModel:responseObject]这个返回的是一个UserModel对象,里面已保存数据
UserModel *user = [selfgetUserModel:responseObject];
//存
NSData *archiveCarPriceData = [NSKeyedArchiverarchivedDataWithRootObject:user];
[[NSUserDefaultsstandardUserDefaults] setObject:archiveCarPriceDataforKey:@“UD_USER"];
//取
UserModel *user1 = [[UserModel alloc] init];
NSData *myEncodedObject = [[NSUserDefaultsstandardUserDefaults] objectForKey:UD_USER];
user1 = [NSKeyedUnarchiverunarchiveObjectWithData: myEncodedObject];
NSUserDefaults写入和读取自定义类转载请注明:http://blog.youkuaiyun.com/l863784757/article/details/45538599
NSUserDefaults可以存取一些短小的信息,例如:NSString, NSNumber, NSDate, NSArray, NSDictionary.
- //存
- NSString *string = [NSString stringWithString @“test"];
- NSUserDefaults *userD = [NSUserDefaults standardUserDefaults];
- [userD setObject:string forKey:@“testKey"];
- //取
- NSString *value;
- value = [userD objectForKey:@“testKey”];
但是如果想存一个自定义的NSObject对象,可以让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。
例如我们常用的用来存用户登录信息的类
UserModel.h文件
- #import <Foundation/Foundation.h>
- @interface UserModel : NSObject<NSCoding>
- @property(nonatomic, strong) NSNumber *score;
- @property(nonatomic, strong) NSNumber *level;
- @property(nonatomic, strong) NSString *name;
- @property(nonatomic, strong) NSString *avatar;
- @property(nonatomic, strong) NSNumber *com;
- @property(nonatomic, strong) NSNumber *mes;
- @end
UserModel.m文件
- #import "UserModel.h"
- #define EC_USER_score @"EC_USER_score"
- #define EC_USER_level @"EC_USER_level"
- #define EC_USER_name @"EC_USER_name"
- #define EC_USER_avatar @"EC_USER_avatar"
- #define EC_USER_com @"EC_USER_com"
- #define EC_USER_mes @"EC_USER_mes"
- @implementation UserModel
- -(void)encodeWithCoder:(NSCoder *)aCoder{
- [aCoder encodeObject:self.score forKey:EC_USER_score];
- [aCoder encodeObject:self.level forKey:EC_USER_level];
- [aCoder encodeObject:self.name forKey:EC_USER_name];
- [aCoder encodeObject:self.avatar forKey:EC_USER_avatar];
- [aCoder encodeObject:self.com forKey:EC_USER_com];
- [aCoder encodeObject:self.mes forKey:EC_USER_mes];
- }
- -(id)initWithCoder:(NSCoder *)aDecoder{
- self = [super init];
- if (self) {
- if (aDecoder == nil) {
- return self;
- }
- self.score = [aDecoder decodeObjectForKey:EC_USER_score];
- self.level = [aDecoder decodeObjectForKey:EC_USER_level];
- self.name = [aDecoder decodeObjectForKey:EC_USER_name];
- self.avatar = [aDecoder decodeObjectForKey:EC_USER_avatar];
- self.com = [aDecoder decodeObjectForKey:EC_USER_com];
- self.mes = [aDecoder decodeObjectForKey:EC_USER_mes];
- }
- return self;
- }
- @end
存取:
//[self getUserModel:responseObject]这个返回的是一个UserModel对象,里面已保存数据
UserModel *user = [selfgetUserModel:responseObject];
//存
NSData *archiveCarPriceData = [NSKeyedArchiverarchivedDataWithRootObject:user];
[[NSUserDefaultsstandardUserDefaults] setObject:archiveCarPriceDataforKey:@“UD_USER"];
//取
UserModel *user1 = [[UserModel alloc] init];
NSData *myEncodedObject = [[NSUserDefaultsstandardUserDefaults] objectForKey:UD_USER];
user1 = [NSKeyedUnarchiverunarchiveObjectWithData: myEncodedObject];