1.官方介绍

1.1 官方文档

NSUserDefaults

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

用户默认数据库的接口,您可以在应用程序的启动过程中持久存储键值对。

当系统调用[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@""]后系统会为用户在沙盒下的Libray/Preferences目录下创建plist文件,文件名为当前应用的Bundle Identifier[[NSBundle mainBundle] bundleIdentifier]用户可以通过NSUserDefaults接口的参数获取到该文件夹下的数据.

1.2 NSUserDefaults数据读写

1.2.1 目标存储内容

The defaults system allows an app to customize its behavior to match a user’s preferences.

应用通过NSUserDefaults存储用户在应用内的偏好设置,比如用户设置了应用的主题颜色,使用NSUserDefaults存储后,用户再次进入应用,应用可以读取到该数据后配置应用的主题颜色(NSUserDefaults保存的数据会缓存起来所以可以实现该类似的需求.但当用户卸载了应用后,数据也将被清除,NSUserDefaults保存的数据不会通过iTunes传递到另外的设备也不会存储到iCloud上面).

因为NSUserDefaults存储的数据是写入到plist文件下,所以用NSUserDefaults存储的数据应该是小型数据而不应该是数据量大的数据.

1.2.2 数据写入

The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Boolean values, and URLs. These methods are described in Setting Default Values.

A default object must be a property list—that is, an instance of (or for collections, a combination of instances of) NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData.

因为NSUserDefaults存储的数据是写入到plist文件的,所以NSUserDefaults支持存储的数据有限,包括有 NSData,NSString,NSNumber,NSDate,NSArray,NSDictionary类型的数据.通常我们使用- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;来设置我们的值.但有些特殊的数据, 系统也提供了几个便利的设置值方法.

- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
复制代码

这里边有一个比较特殊的方法-setURL:forKey,你可以保存数据的本地地址而不需要直接保存完整数据.

/// -setURL:forKey is equivalent to -setObject:forKey: except that the value is archived to an NSData. Use -URLForKey: to retrieve values set this way.
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
复制代码

当你存储的文件可能存在更改的情况下需要用到一下方法去建立书签存储数据.

/* Returns bookmark data for the URL, created with specified options and resource values. If this method returns nil, the optional error is populated.*/
- (nullable NSData *)bookmarkDataWithOptions:(NSURLBookmarkCreationOptions)options includingResourceValuesForKeys:(nullable NSArray<NSURLResourceKey> *)keys relativeToURL:(nullable NSURL *)relativeURL error:(NSError **)error API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));/* Creates and Initializes an NSURL that refers to a location specified by resolving bookmark data. If this method returns nil, the optional error is populated.*/
+ (nullable instancetype)URLByResolvingBookmarkData:(NSData *)bookmarkData options:(NSURLBookmarkResolutionOptions)options relativeToURL:(nullable NSURL *)relativeURL bookmarkDataIsStale:(BOOL * _Nullable)isStale error:(NSError **)error API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
复制代码

当我们设置数据后,系统并不会立即保存到本地,而是会在一个系统觉得恰当的时间点进行存储,如果我们需要立即存储的话需要调用- (BOOL)synchronize;方法来实现.

1.2.3 数据读取

通常我们调用- (nullable id)objectForKey:(NSString *)defaultName;方法来获取我们存储的数据.系统还为我们提供了一些特别的接口供我们使用.

- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
- (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
复制代码

注意点:当我们存储的数据是可变类型时,读取后的数据将变为不可变类型.

1.2.4 数据变化监听

当我们的NSUserDefaults实例所存储的数据变更时,系统会发送NSUserDefaultsDidChangeNotification的通知,通知会返回当前更改的NSUserDefaults实例对象回来.所以当需要监听某个NSUserDefaults数据存储的数据变化时,可以添加该通知的观察者.

1.3 沙盒的注意事项

我们的应用数据时存储在沙盒目录中的,正常情况下其他应用是无法读取到我们应用的数据.但是有两种情况是被允许应用去读取其他应用的数据.

  • App extensions on macOS and iOS
  • Other apps in your application group on macOS

当我们有扩展程序或者多个应用在同一个应用组里面的时候就能被允许进行这样的操作.

当我们设置了两个应用为在同一个App Groups后,我们的代码便可以通过组名来获取应用间共享的数据了.

[[NSUserDefaults alloc] initWithSuiteName:@"group.NSUserDefaultsDemo"]
复制代码

1.4 线程安全

Thread SafetyThe UserDefaults class is thread-safe. 系统在读写NSUserDefaults时是有做线程安全措施的,所以开发者在使用NSUserDefaults时是不需要考虑多线程问题.

2.API介绍

系统提供的默认存储接口

@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;
复制代码

清空当前默认存储的数据,数据如果被KVO监听的也将失效.

+ (void)resetStandardUserDefaults;
复制代码

通过域名创建数据表,这里的suitenamenil时生成的实例将会是系统提供的默认接口,这里不应该用应用的bundle identifierNSGlobalDomain来作为参数.传入的suitename将作为identifier来存储.

- (nullable instancetype)initWithSuiteName:(nullable NSString *)suitename
复制代码

返回当前所有的数据

- (NSDictionary<NSString *, id> *)dictionaryRepresentation;
复制代码

移除当前key以及对应的值,这个方法和-[... setObject:nil forKey:defaultName]是等价的

- (void)removeObjectForKey:(NSString *)defaultName;
复制代码

添加域名(当添加了另一个域名后,可以该实例查询数据时也将会在此域名下查询,优先在当前域名查询,结束后在其他子域名查询)

- (void)addSuiteNamed:(NSString *)suiteName;
复制代码

移除域名

- (void)removeSuiteNamed:(NSString *)suiteName;
复制代码

注册字典数据,常放在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions调用.当你需要事先存储一些基本数据供应用读取时,就可以通过此方法来配置了.

  • 注意的是如果字典里包含有了更改过后的Key,该Key将不会再被写入,比如字典中有userName这个Key,Value10001的默认值,当再应用内更改了userName的值后,下次再进入应用,该Key不会再赋值为10001了.
- (void)registerDefaults:(NSDictionary<NSString *, id> *)registrationDictionary;
复制代码

不稳定域相关接口

/// 不稳定域的不稳定域名数组(包括了NSRegistrationDomain,NSArgumentDomain)
@property (readonly, copy) NSArray<NSString *> *volatileDomainNames;/// 获取某个不稳定域名下对应的数据
- (NSDictionary<NSString *, id> *)volatileDomainForName:(NSString *)domainName;/// 通过域名以及字典数据设置不稳定域
- (void)setVolatileDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;/// 通过域名以及不稳定域
- (void)removeVolatileDomainForName:(NSString *)domainName;
复制代码

稳定域相关接口,与不稳定域类似

- (nullable NSDictionary<NSString *, id> *)persistentDomainForName:(NSString *)domainName;
- (void)setPersistentDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
- (void)removePersistentDomainForName:(NSString *)domainName;
复制代码

注意点

  • 稳定域将会写入本地Preferences文件夹里面生成对应的plist文件,不稳定域将不会生成.
  • initWithSuiteName生成的为稳定域

3.域

NSUserDefault中存在域的概念,包含5个部分NSArgumentDomainApplicationNSGlobalDomainLanguagesNSRegistrationDomain

  • NSArgumentDomain:代表的是命令行参数,可以在Edit Scheme->Arguments->Arguments Passed On Launch中添加,格式是-key value
  • Application: 应用程序域,设置的方法默认数据保存是在这里
  • NSGlobalDomain: 全局域,所有应用程序都将公用该域
  • Languages: 国际化语言版本域
  • NSRegistrationDomain: 临时域,- (void)registerDefaults:(NSDictionary*)registrationDictionary方法被调用是数据是保存在这里。在读取数据时,都会在底层的存储结构中进行一次搜索,搜索的顺序是这样:
NSArgumentDomain->Application->NSGlobalDomain->Languages->NSRegistrationDomain
复制代码

4.参考

谈谈大家熟悉的NSUserDefault

iOS笔记之NSUserDefaults

iOS通过NSUserDefaults实现简单的应用间数据传递

转载于:https://juejin.im/post/5ce756aef265da1b6d3ffee6

iOS-NSUserDefaults详解相关推荐

  1. [iOS] 国际化详解

    PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...

  2. FreeEIM 来点新知识iOS UIScrollView详解

     老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...

  3. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  4. IOS UIView详解

    文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...

  5. iOS疯狂详解之AFNetworking图片缓存问题

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  6. iOS多线程详解:实践篇

    iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...

  7. iOS疯狂详解之开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  8. UE4 IOS打包详解

    写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...

  9. iOS模式详解runtime面试工作

    简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...

  10. ios pods 详解

    CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 ...

最新文章

  1. LVM逻辑卷管理测试——创建逻辑卷
  2. verilog中对inout信号的处理
  3. 史上最全!27种神经网络简明图解:模型那么多,我该怎么选?
  4. setAdapter(adapter)空指针nullPointer 解决办法
  5. List泛型集合总结(一)
  6. 【数据表间关联关系】 一对多、多对一、一对一、多对多
  7. QQuickRenderControl
  8. php修改mysql数据找不到_php 如何修改mysql数据
  9. 今天的我坐下来的蜡笔小新
  10. 《视觉SLAM十四讲——从理论到实践》学习笔记
  11. hbase权威指南-客户端API高级特性
  12. 对称矩形C语言,c语言编程求任意对称正定矩阵的逆。
  13. 网盘参差不齐,实测对比
  14. NAND Flash一般地址线和数据线共用,对读写速度有一定影响;而NOR Flash闪存数据线和地址线分开,所以相对而言读写速度快一些。
  15. 禁用红蜘蛛自启的简单办法
  16. abc F - Endless Walk
  17. 【上海房价预测】代码实现——利用BP神经网络进行上海二手房价预测
  18. 全球与中国pH控制剂市场现状及未来发展趋势(2022)
  19. 软件测试需要学什么?测试学习大纲梳理
  20. nmap 扫描端口_Nmap端口规格和扫描顺序

热门文章

  1. js 数组转对象方法
  2. Qt+imx6编写的楼宇对讲管理平台
  3. 三菱服务器显示RL,三菱逆变器故障显示
  4. IBM SPSS Statistics 27 Mac(spss专业统计分析软件)
  5. Nero刻录cd时显示乱码
  6. 腾讯会议突然中断,录制的视频怎么恢复。如何找到腾讯会议保存的视频,腾讯会议怎样录制视频
  7. JS提交表单的几种方式
  8. 什么是智能代还软件APP呢?代还市场怎么样呢?
  9. 关于php的求职简历免费下载,PHP程序员求职简历模板下载
  10. git不再询问帐号密码_您的密码不再是秘密,第1部分