NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:

[cpp] view plaincopy
  1. NSString *string = [NSString stringWithString @"hahaha"];
  2. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
  3. [ud setObject:string forKey:@"myKey"];
  4. NSString *value;
  5. value = [ud objectForKey:"myKey"];

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。

那怎么办呢?

我找到的方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

粘代码:

假设有这样一个简单的类对象

[cpp] view plaincopy
  1. @interface BusinessCard : NSObject <NSCoding>{
  2. NSString *_firstName;
  3. NSString *_lastName;
  4. }
  5. @property (nonatomic, retain) NSString *_firstName;
  6. @property (nonatomic, retain) NSString *_lastName;
  7. @end;
  8. @implementation BusinessCard
  9. @synthesize _firstName, _lastName;
  10. - (void)dealloc{
  11. [_firstName release];
  12. [_lastName release];
  13. [super dealloc];
  14. }
  15. - (id) initWithCoder: (NSCoder *)coder
  16. {
  17. if (self = [super init])
  18. {
  19. self._firstName = [coder decodeObjectForKey:@"_firstName"];
  20. self._lastName = [coder decodeObjectForKey:@"_lastName"];
  21. }
  22. return self;
  23. }
  24. - (void) encodeWithCoder: (NSCoder *)coder
  25. {
  26. [coder encodeObject:_firstName forKey:@"_firstName"];
  27. [coder encodeObject:_lastName forKey:@"_lastName"];
  28. }
  29. @end

然后再存取时通过NSData做载体:

[cpp] view plaincopy
  1. BusinessCard *bc = [[BusinessCard alloc] init];
  2. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
  3. NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];
  4. [ud setObject:udObject forKey:@"myBusinessCard"];
  5. [bc release];
  6. udObject = nil;
  7. udObject = [ud objectForKey:@"myBusinessCard"];
  8. bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;

以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。

如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现<NSCoding>。

本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366247,如需转载请自行联系原作者

[IOS]NSUserDefaults读取和写入相关推荐

  1. NSUserDefaults读取和写入自定义对象

    NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: [cpp] view plaincopy NSString *string = [NSS ...

  2. c++读取和写入TXT文件的整理

    c++读取和写入TXT文件的整理 #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文 ...

  3. Flutter进阶—读取与写入文件

    Flutter使用path_provider插件读取与写入文件,path_provider插件提供了一种平台无关的方法来访问设备文件系统上常用的位置.该类目前支持访问两个文件系统位置: 临时目录:系统 ...

  4. c++读取和写入TXT文件的整理 1

    c++读取和写入TXT文件的整理 #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文 ...

  5. IOS NSUserDefaults 讲解 用法

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

  6. python读取excel内容和写入_Python读取和写入Excel文件

    制作Excel表 常用方法说明 Workbook类 Workbook类创建一个XlswWrite的Workbook对象,相当于创建一个excel表 And_worksheet()用来创建工作表,默认为 ...

  7. C++中txt文件的读取和写入

    C++中Txt文件读取和写入 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< ...

  8. python 点云las、laz文件的读取、写入、压缩

    1. python las读取与写入 用laspy库: https://pypi.org/project/laspy/ 获取las.laz的规格.点数据格式,点数据的具体字段名称,具体的点数据 解析l ...

  9. Java CSV文件读取、写入及追加

    Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...

  10. C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    用VS2012调试时发现在调用数据集时提示"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 用管理员身份运行CMD,输入netsh winsock reset并回车 转载 ...

最新文章

  1. 搜索引擎惩罚的五种最大原因
  2. Java多线程学习(二)---线程创建方式
  3. Java虚拟机JVM常用的几种回收算法和垃圾回收器
  4. c语言那些细节之a+1和a+1的区别
  5. Scrapy学习-24-集成elasticsearch
  6. C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
  7. 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
  8. 编写vbs脚本发送邮件
  9. Spring框架 注解
  10. echarts-for-react的使用详解
  11. Android View的滚动原理简单解析
  12. 【数仓】大数据领域建模综述-《大数据之路》读书笔记
  13. c#选择文件保存路径
  14. 深蓝学院-多传感器融合定位课程-第4章-点云地图构建及基于地图的定位
  15. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
  16. Epub电子书格式(四)
  17. html左边是菜单右边是内容,左首菜单栏右侧内容
  18. 字节跳动 算法全四面 详细面经 已拿意向书
  19. 远程辅助必备免费神器ToDesk远程控制软件(答辩,远程,调试,办公)必备远程工具
  20. Android Snackbar简单解析

热门文章

  1. SpringBoot 系列
  2. sql语言的一大类 DML 数据的操纵语言
  3. xml 操作组件(NewLife.XCode)
  4. IOS之拨打电话的三种方式
  5. modelsim多模块联合仿真时,同一signal,一边有信号另一边没有的问题
  6. 什么样的终端才是最合适桌面虚拟化的呢?
  7. 解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题
  8. 博科brocade光纤交换机alias-zone的划分--实操案例
  9. Android SDK4.0(api14)安装
  10. [导入]2008李幼斌电视剧力作《我是太阳》全42集