[IOS]NSUserDefaults读取和写入
NSUserDefaults可以存取一些短小的信息。
比如存入再读出一个字符串到NSUserDefaults:
- NSString *string = [NSString stringWithString @"hahaha"];
- NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
- [ud setObject:string forKey:@"myKey"];
- NSString *value;
- 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中进行读取。
粘代码:
假设有这样一个简单的类对象
- @interface BusinessCard : NSObject <NSCoding>{
- NSString *_firstName;
- NSString *_lastName;
- }
- @property (nonatomic, retain) NSString *_firstName;
- @property (nonatomic, retain) NSString *_lastName;
- @end;
- @implementation BusinessCard
- @synthesize _firstName, _lastName;
- - (void)dealloc{
- [_firstName release];
- [_lastName release];
- [super dealloc];
- }
- - (id) initWithCoder: (NSCoder *)coder
- {
- if (self = [super init])
- {
- self._firstName = [coder decodeObjectForKey:@"_firstName"];
- self._lastName = [coder decodeObjectForKey:@"_lastName"];
- }
- return self;
- }
- - (void) encodeWithCoder: (NSCoder *)coder
- {
- [coder encodeObject:_firstName forKey:@"_firstName"];
- [coder encodeObject:_lastName forKey:@"_lastName"];
- }
- @end
然后再存取时通过NSData做载体:
- BusinessCard *bc = [[BusinessCard alloc] init];
- NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
- NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];
- [ud setObject:udObject forKey:@"myBusinessCard"];
- [bc release];
- udObject = nil;
- udObject = [ud objectForKey:@"myBusinessCard"];
- bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;
以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。
如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现<NSCoding>。
本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366247,如需转载请自行联系原作者
[IOS]NSUserDefaults读取和写入相关推荐
- NSUserDefaults读取和写入自定义对象
NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: [cpp] view plaincopy NSString *string = [NSS ...
- c++读取和写入TXT文件的整理
c++读取和写入TXT文件的整理 #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文 ...
- Flutter进阶—读取与写入文件
Flutter使用path_provider插件读取与写入文件,path_provider插件提供了一种平台无关的方法来访问设备文件系统上常用的位置.该类目前支持访问两个文件系统位置: 临时目录:系统 ...
- c++读取和写入TXT文件的整理 1
c++读取和写入TXT文件的整理 #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文 ...
- IOS NSUserDefaults 讲解 用法
IOS NSUserDefaults 讲解 用法 NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults ...
- python读取excel内容和写入_Python读取和写入Excel文件
制作Excel表 常用方法说明 Workbook类 Workbook类创建一个XlswWrite的Workbook对象,相当于创建一个excel表 And_worksheet()用来创建工作表,默认为 ...
- C++中txt文件的读取和写入
C++中Txt文件读取和写入 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< ...
- python 点云las、laz文件的读取、写入、压缩
1. python las读取与写入 用laspy库: https://pypi.org/project/laspy/ 获取las.laz的规格.点数据格式,点数据的具体字段名称,具体的点数据 解析l ...
- Java CSV文件读取、写入及追加
Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...
- C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
用VS2012调试时发现在调用数据集时提示"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 用管理员身份运行CMD,输入netsh winsock reset并回车 转载 ...
最新文章
- 搜索引擎惩罚的五种最大原因
- Java多线程学习(二)---线程创建方式
- Java虚拟机JVM常用的几种回收算法和垃圾回收器
- c语言那些细节之a+1和a+1的区别
- Scrapy学习-24-集成elasticsearch
- C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
- 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
- 编写vbs脚本发送邮件
- Spring框架 注解
- echarts-for-react的使用详解
- Android View的滚动原理简单解析
- 【数仓】大数据领域建模综述-《大数据之路》读书笔记
- c#选择文件保存路径
- 深蓝学院-多传感器融合定位课程-第4章-点云地图构建及基于地图的定位
- 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
- Epub电子书格式(四)
- html左边是菜单右边是内容,左首菜单栏右侧内容
- 字节跳动 算法全四面 详细面经 已拿意向书
- 远程辅助必备免费神器ToDesk远程控制软件(答辩,远程,调试,办公)必备远程工具
- Android Snackbar简单解析
热门文章
- SpringBoot 系列
- sql语言的一大类 DML 数据的操纵语言
- xml 操作组件(NewLife.XCode)
- IOS之拨打电话的三种方式
- modelsim多模块联合仿真时,同一signal,一边有信号另一边没有的问题
- 什么样的终端才是最合适桌面虚拟化的呢?
- 解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题
- 博科brocade光纤交换机alias-zone的划分--实操案例
- Android SDK4.0(api14)安装
- [导入]2008李幼斌电视剧力作《我是太阳》全42集