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字符串固定,防止手动写的时候前后不一致导致出错
相关推荐
编程范式17 小时前
SwiftUI 中图片如何适配可用空间
ios
counterxing1 天前
最近发现一个 Mac 工具,有点像把 Raycast、语音输入法、截图和录屏塞到了一起
macos·ai编程·claude
songgeb3 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
壹方秘境6 天前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
元Y亨H9 天前
MacBook Air 开发神器:IDEA 与 PyCharm 极简安装及环境配置
macos
yuanyxh10 天前
macOS 应用 - 纯对话生成
前端·macos·ai编程
通信小呆呆11 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick11 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee11 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
AI创界者11 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频