iOS——NSUserDefaults学习

iOS------NSUserDefaults学习

NSUserDefaults 是什么

  • NSUserDefaults 是一种轻量级的数据持久化方案,轻量级指的是它的存储适用于一些小型且重要的数据
  • 它的用法非常类似于字典 NSDictionary,都是以键值对的方式存取数据,我们可以用一个字符串的 key 来存一个值,之后再拿着这个 key 去取出来

你可以把它理解成一个永久版的字典------普通字典在程序运行结束后就消失了,而 NSUserDefaults 里的数据会被写入本地文件,下次打开 App 还在,只是需要再从里面取出来

适合存什么

  • 因为它是轻量级的,所以 NSUserDefaults 更适合存储类似以下数据
    1. 用户的偏好设置(如深色模式开关)
    2. 某个小数值、布尔值的开关状态

不适合用它存图片、大段文字、复杂对象列表等,NSUserDefaults 只适合存"配置"级别的小数据,原因是使用NSUserDefaults的时候运行app会直接将里面存储的所有数据一次性加载进内存,启动速度就会变慢

基本用法

获取实例

  • NSUserDefaults其实是一个单例,我们可以通过它的类方法拿到单例对象

它叫做 standardUserDefaults

objc 复制代码
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

它是一个单例,整个 文件里拿到的都是同一个对象,所以不需要自己 alloc init

存数据

  • 存数据用的是一系列 setXxx:forKey: 方法,根据数据类型不同,方法名也不一样
objc 复制代码
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//存一个字符串
[defaults setObject:@"aaa" forKey:@"userName"];

//存一个整数
[defaults setInteger:18 forKey:@"age"];

//存一个布尔值
[defaults setBool:YES forKey:@"isAudlt"];

//存一个浮点数
[defaults setFloat:9.9 forKey:@"score"];
  • 可以看到,根据值的类型,方法名会有变化:
    • 对象类型(NSString、NSArray、NSDictionary 等)用 setObject:forKey:
    • 基础类型(int、BOOL、float、double)有各自对应的方法

注意 key 是一个 NSString,需要存取时一致,很容易出现由于字符串不一致导致的存取错误

取数据

  • 取数据同样根据类型有对应的方法,只需要传入存数据时用的 key
objc 复制代码
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//取字符串
NSString *username = [defaults stringForKey:@"userName"];

//取整数
NSInteger age = [defaults integerForKey:@"age"];

//取布尔值
BOOL isFirstLaunch = [defaults boolForKey:@"isAudlt"];

//取浮点数
float score = [defaults floatForKey:@"score"];

如果取一个从来没存过的 key,不会崩溃,基础类型会返回 0 或 NO,对象类型会返回 nil,也就是默认的形态

删数据

  • 删数据直接用 removeObjectForKey: 方法,传入 key 就可以
objc 复制代码
[defaults removeObjectForKey:@"username"];

关于 synchronize

objc 复制代码
[defaults synchronize];

这是在以前的 iOS 版本里,用来强制将内存中的数据立刻写入磁盘的方法,但现在已经被优化了,会自动添加,无须手动调用,所以写不写无所谓

实际使用举例

判断是否是第一次启动

  • 这是 NSUserDefaults 最常见的使用场景之一,在 App 里判断用户是否是第一次打开,决定是否展示引导页
objc 复制代码
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL isFirst = [defaults boolForKey:@"isFirst"];

if (!isFirst) {
    //第一次启动,展示引导页
    [self showOnboardingPage];
    //标记为已经启动过
    [defaults setBool:YES forKey:@"isFirst"];
}

这里的逻辑是,第一次进来时 boolForKey: 取到的是 NO,所以 !isFirst 是 YES,走进 if 里展示引导页,同时立刻把它存为 YES,下次打开就不会再进来了

保存用户名

objc 复制代码
//保存用户名
- (void)saveUsername:(NSString *)name {
    [[NSUserDefaults standardUserDefaults] setObject:name forKey:@"username"];
}

//需要显示用户名时取出来
- (NSString *)loadUsername {
    return [[NSUserDefaults standardUserDefaults] stringForKey:@"username"];
}

注意

  • NSUserDefaults不要存储大型数据如图片,段落等加载时间长的内容
  • 同时由于NSUserDefaults是以plist文件的形式存储的,所以信息容易被读取,不要将密码等敏感信息存储在NSUserDefaults中
  • 建议提前把key字符串固定,防止手动写的时候前后不一致导致出错
相关推荐
易小染2 小时前
AI-Agent学习-LangChain-01
学习·langchain
2601_955767423 小时前
iPhone 17 OLED 屏幕偏振光学分析 & AR 镀膜与双护技术实践解析
人工智能·科技·ios·iphone·圆偏振光
xian_wwq4 小时前
【学习笔记】「大模型安全:攻击面演化史」第 03 篇-数据投毒
笔记·学习·ai安全
8125035334 小时前
第 5 篇:MAC 地址——IP 管远方,MAC 管眼前
macos
.千余5 小时前
【C++】手写双向链表:list容器模拟实现
开发语言·c++·笔记·学习·其他
元Y亨H5 小时前
Mac 办公效率进阶笔记
macos
元Y亨H5 小时前
Mac 高级程序员配置笔记 (Java & Python 篇)
macos
元Y亨H5 小时前
Mac 从入门到精通:效率进阶笔记
macos
人月神话Lee6 小时前
【图像处理】颜色空间——RGB之外的世界
ios·ai编程·图像识别