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];

转载于:https://www.cnblogs.com/Apologize/p/4564153.html

NSUserDefaults的一些用法相关推荐

  1. NSUserDefaults的用法

    2019独角兽企业重金招聘Python工程师标准>>> NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] ...

  2. IOS中NSUserDefaults的用法

    2019独角兽企业重金招聘Python工程师标准>>> IOS中NSUserDefaults的用法(轻量级本地数据存储) 分类: IOS开发 Object-C编程语言2012-09- ...

  3. IOS NSUserDefaults 讲解 用法

    IOS NSUserDefaults 讲解 用法    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults ...

  4. NSUserDefaults的用法(轻量级本地数据存储)

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...

  5. IOS中NSUserDefaults的用法(轻量级本地数据存储)

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...

  6. NSUserDefaults 的用法

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefaults里 ...

  7. iOS开发笔记(十七):持久化方案之 NSUserDefaults

    对于应用来说,每个用户都有自己的独特偏好设置,而好的应用会让用户根据喜好选择合适的使用方式,把这些偏好记录在应用包的 plist 文件中,通过 NSUserDefaults 类来访问,这是 NSUse ...

  8. 用户首选项NSUserDefaults

    2019独角兽企业重金招聘Python工程师标准>>> 用户首选项是用来保存和记录用户在操作应用的过程做做出的一些选择或设置.类似Android开发中的SharedPreferenc ...

  9. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

最新文章

  1. 车辆摄像头夜晚场景图像ISP增强算法
  2. android+邮箱删除邮件,在Android上删除烦人的语音邮件通知 | MOS86
  3. 撤销 git commit
  4. python语言怎么学-如何从零开始学习Python,python语言编程入门
  5. 网站运营活动总结报告模板
  6. 第十一届蓝桥杯java B组第二场-试题A: 门牌制作
  7. Node:中间件——express简单的写日志中间件
  8. 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象...
  9. xp怎么设置计算机共享的打印机共享的打印机共享,XP设置打印机局域网共享的解决方法步骤...
  10. python监控进程脚本_进程监控的python脚本
  11. 工程与建设杂志工程与建设杂志社工程与建设编辑部2022年第3期目录
  12. All-Pay Contests 论文定理推导(博弈论+机制设计)
  13. WIN10 如何隐藏桌面图标
  14. CodeForces 1538G : Gift Set 思维 + 二分
  15. PID微分器与滤波器的爱恨情仇
  16. C语言在坐标轴上输出曲线,C语言打印正弦曲线、直线、圆等等
  17. 解决 matplotlib 字体问题最简单的方法,将matplotlib更改字体为 宋体、TimesNewRoman
  18. 统计工作随笔—同比与环比(同期为负值)、百分点
  19. 用DOS命令打开IE浏览器、我的文档等等
  20. 昆山计算机等级考试考点,广东计算机等级考试报名时间和地点统计

热门文章

  1. java 连接redis_Redis 开发陷阱及避坑指南!
  2. 【k8s学习笔记】第二篇:在Ubuntu系统中安装kubelet,kubeadm和kubectl
  3. redis集群的三种模式
  4. 判断回文(Python)
  5. DL论文第一周-Deep learning
  6. Spark Standalone模式应用程序开发
  7. node-red教程 7dashboard简介与输入型仪表板控件的使用
  8. 深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)
  9. 机器学习基础——实现基本的决策树
  10. 线性代数相关知识点回顾