关于NSUserDefaults保存自定义变量的方式

本文介绍了如何在iOS开发中使用NSCoding协议使自定义类能够存储到NSUserDefaults,包括编码、解码过程及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天遇到一个问题,自定义了一个实例,用NSUserDefaults存储的时候,存储不了。网上搜了一下,发现需要实现两个方法,如下:


如下内容转载自:http://www.cnblogs.com/edwardlauxh/archive/2012/03/22/2411064.html


由于NSUserDefaults 不支持保存自定类,保存的对象需要实现NSCoding协议,不过自定的类型就算实现了NSCoding也不可以保存,可以通过以下方法实现:

复制代码
//h文件
#import <Foundation/Foundation.h>

@interface UserBean : NSObject<NSCoding>

@property NSInteger userid;
@property(nonatomic,copy)NSString *address;
@property(nonatomic,copy)NSString *levelName;
@property(nonatomic,copy)NSString *mobile;
@property(nonatomic,copy)NSString *telphone;
@property(nonatomic,copy)NSString *userName;
@property(nonatomic,copy)NSString *realName;
@property(nonatomic,copy)NSString *email;
@property NSInteger sex;
@property(nonatomic,copy)NSString *password;
@end

//m文件

#import "UserBean.h"

@implementation UserBean
@synthesize userid,mobile,email,sex,address,password,realName,telphone,userName,levelName;

- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:email forKey:@"email"];
[aCoder encodeObject:userName forKey:@"userName"];
[aCoder encodeObject:mobile forKey:@"mobile"];
[aCoder encodeObject:address forKey:@"address"];
[aCoder encodeObject:password forKey:@"password"];
[aCoder encodeObject:realName forKey:@"realName"];
[aCoder encodeObject:telphone forKey:@"telphone"];
[aCoder encodeObject:levelName forKey:@"levelName"];
[aCoder encodeInteger:sex forKey:@"sex"];
[aCoder encodeInteger:userid forKey:@"userid"];

}
- (id)initWithCoder:(NSCoder *)aDecoder{
email= [aDecoder decodeObjectForKey:@"email"] ;
sex= [aDecoder decodeIntegerForKey:@"sex"];
userid= [aDecoder decodeIntegerForKey:@"userid"];
mobile= [aDecoder decodeObjectForKey:@"mobile"];
address= [aDecoder decodeObjectForKey:@"address"];
password= [aDecoder decodeObjectForKey:@"password"];
realName= [aDecoder decodeObjectForKey:@"realName"];
telphone= [aDecoder decodeObjectForKey:@"telphone"];
userName= [aDecoder decodeObjectForKey:@"userName"];
levelName= [aDecoder decodeObjectForKey:@"levelName"];
return self;
}
@end
复制代码

通过实现

NSKeyedArchiver转换成NSData然后保存到NSUserDefaults中,然后取值的时候可以通过NSKeyedUnarchiver读NSData获得对应的user,代码如下:

复制代码
 NSUserDefaults *nsuser= [NSUserDefaults standardUserDefaults];
UserBean *user = [[UserBean alloc]init];
[user setSex:0];
[user setEmail:@"22222"];
//将对象转化为字节流
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];

[nsuser setObject:data forKey:@"userbean"];
//同步
[nsuser synchronize];
//获取字节流
NSData *data_1 =[nsuser objectForKey:@"userbean"];
//解码
UserBean *user1 = [NSKeyedUnarchiver unarchiveObjectWithData:data_1];


NSLog(@"%@",[user1 email]);


记录仅供学习。


最后再附上一篇关于数据存储方式介绍与选择的文章,觉得不错。

http://blog.youkuaiyun.com/sbitswc/article/details/8738067



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值