摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了

一、了解NSUserDefaults以及它可以直接存储的类型 二、使用 NSUserDefaults 存储自定义对象 1、将自定义类型转换为NSData类型 2、将自定义类型数据存入 NSUserDefaults 中 3、使用MJExtension一句话搞定对象归档

一、了解NSUserDefaults以及它可以直接存储的类型

NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。

使用 NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出:

NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,只需要简单的操作(一个Value 一个Key ),例如,想要保存一个NSString的对象,代码实现为:

[objc] view plaincopy
  1. //将NSString 对象存储到 NSUserDefaults 中
  2. NSString *passWord = @"1234567";
  3. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  4. [user setObject:passWord forKey:@"userPassWord"];

将数据取出也很简单,只需要取出key 对应的值就好了,代码如下:

[objc] view plaincopy
  1. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  2. NSString *passWord = [ user objectForKey:@"userPassWord"];

注意:对相同的Key赋值约等于一次覆盖,要保证每一个Key的唯一性

值得注意的是:

NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug),例如,如果我想要存储一个 NSMutableArray 对象,我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去,代码如下:

[objc] view plaincopy
  1. NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil nil];
  2. NSArray * array = [NSArray arrayWithArray:mutableArray];
  3. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  4. [user setObject:array forKey:@"记住存放的一定是不可变的"];

取出数据是一样的,想要用NSUserDefaults中的数据给可变数组赋值

先给出一个错误的写法:

[objc] view plaincopy
  1. /*-------------------------错误的赋值方法-------------------*/
  2. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  3. //这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug
  4. NSMutableArray *mutableArray = [user objectForKey:@"记住存放的一定是不可变的"];

正确的写法:

[objc] view plaincopy
  1. /*-------------------------正确的赋值方法-------------------*/
  2. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  3. //可以用alloc 方法代替
  4. NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"记住存放的一定是不可变的"]];

取出数据是一样的,想要用NSUserDefaults中的数据给可变数组赋值

先给出一个错误的写法:

[objc] view plaincopy
  1. /*-------------------------错误的赋值方法-------------------*/
  2. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  3. //这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug
  4. NSMutableArray *mutableArray = [user objectForKey:@"记住存放的一定是不可变的"];

正确的写法:

[objc] view plaincopy
  1. /*-------------------------正确的赋值方法-------------------*/
  2. NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  3. //可以用alloc 方法代替
  4. NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"记住存放的一定是不可变的"]];

二、使用 NSUserDefaults 存储自定义对象

1、将自定义类型转换为NSData类型

当数据重复而且多的时候(例如想存储全班同学的学号,姓名,性别(这个数据量可能太大了 )),如果不用SQLite 存储 (多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和 NSUserDefaults 比起来麻烦多了(因为NSFileManage 本来就挺复杂) ,但是问题是,NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型,下面举一个例子来介绍。

转载于:https://www.cnblogs.com/HHD-9199/p/8572491.html

iOS NSUserDefaults 简介 NSUserDefaults 存储自定义对象相关推荐

  1. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    2019独角兽企业重金招聘Python工程师标准>>> 一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例 ...

  2. 集合中存储自定义对象源代码

    集合中存储自定义对象: package attention;import java.util.ArrayList; import java.util.Collection; import java.u ...

  3. HashSet存储自定义对象保证元素唯一性图解原理及代码优化

    HashSet存储自定义对象保证元素唯一性图解原理及代码优化 1.原理: * 1.HashSet原理       * 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比 ...

  4. 本实例演示往TreeSet集合中存储自定义对象

    1 package JiHe.Set; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 /* 7 * 本实例演示往Tree ...

  5. android sqlite存对象,【Android基础】Android SQLite存储自定义对象

    Android SQLite存储自定义对象 在SQLite数据库中可存储的数据类型有NULL.INTEGER.REAL(浮点型).TEXT.BOOL,一共是五种数据类型.在Android开发中,我们存 ...

  6. ArrayList存储自定义对象并遍历三种方式(迭代器 普通for 增强for)

    import java.util.ArrayList; import java.util.Iterator;/** ArrayList存储自定义对象并遍历* A:迭代器* B:普通for* C:增强f ...

  7. 通过YYCache存储自定义对象

    如果保存的自定义对象不遵守NSCoding的协议或不实现NSCoding协议的方法,就不能使用YYDiskCache进行长期缓存.(原来所有原生的类都是实现了NSCoding协议,在归档的过程中进行了 ...

  8. 如何使用YYCache存储自定义对象

    YYCache是一个缓存框架,由YYCache.YYDiskCache.YYMemoryCache和YYKVStorage组成.在项目开发过程中,想通过YYCache存储一个自定义对象,这个对象包括文 ...

  9. 站在巨人的肩膀上-像kubernetes一样用etcd存储自定义对象

    背景 众所周知,kubernetes利用etcd存储API对象,例如Pod.Deployment.StatefulSet等等.笔者认为kubernetes这种API对象的设计方案当前来看非常先进,基于 ...

最新文章

  1. 硅谷精英的薪水大揭秘,你和他们差距有多大?
  2. python小程序3
  3. Web.config 灵活配置
  4. JVM实战与原理--前言及索引
  5. 搭建IIS并配置网站之旅
  6. 以 B2C 和 B2B 方式启动 SAP Spartacus 的批处理文件
  7. linux配置定时删除日志文件,Linux使用shell脚本定时删除历史日志文件
  8. Redhat或者Centos 手动安装sublime text 3
  9. python提取列表中文本_Python正则表达式:从文本文件中提取关键字后的元组列表...
  10. 美国网络安全体系架构揭秘
  11. SHEditor v0.3 SkinSharp皮肤设计工具
  12. 【Unity拓展工具】批量更改脚本文件的编码格式 (unity中脚本文件的编码格式从ANSI转换到UTF8出现乱码)
  13. 图形验证码实现(代码)
  14. 中级软件设计师知识点总结
  15. 『中文、英文词频统计分析软件』免费工具分享
  16. 2022用户画像构建
  17. 项目 编码规则(编写代码规则)
  18. 好好说话之Tcache Attack(2):tcache dup与tcache house of spirit
  19. DES_3DES_AES_IDES_RSA密码算法比较
  20. SSM项目的基本静态资源配置

热门文章

  1. 微信自动回复和自动抢红包实现原理(二):自动回复
  2. 基于SNMP的MIB库访问实现的研究
  3. php accesscontrolalloworigin,php – Access-Control-Allow-Origin没有显示在codeigniter的响应头中...
  4. python打架动态图_20个GIF动图解释令程序员崩溃的瞬间 - 里维斯社
  5. long 比较大小_Long-Term Feature Banks
  6. php 批量删除cookie,php批量删除cookie的简单实现方法
  7. python手写均值滤波器_python手写均值滤波
  8. php 非阻塞post请求,PHP实现的CURL非阻塞调用类
  9. cad能整体比例缩小吗_CAD中两个缩放的不同及其各自的应用
  10. 服务器是什么系统_为什么视频监控系统搭建,要使用流媒体服务器做视频分发?...