Objective-C学习笔记第十五章文件加载与保存
Cocoa提供了Core Data,他能在后台处理所有文件内容
Cocoa提供了两个通用的文件处理类:属性列表和对象编码
一、属性列表类
在Cocoa中,有一类名为属性列表的对象,简写为plist。
这些列表包含Cocoa操作的一组对象,Cocoa知道如何将他们保存到文件中并进行加载
属性列表类包括:NSArray、NSDictionary、NSString、NSNumber、NSDate和NSData以及他们的变体
1.NSDate
NSDate是Cocoa中用于处理日期和时间的基础类
[NSDate date]获取当前的日期和时间,它是自动释放对象
+dateWithTimeIntervalSinceNow:(NSTimeInterval *)获取与当前时间相隔的时间差
NSTimeInterval是一个双精度参数,表示以秒为单位的时间间隔,正数为将来的时间,负数为过去的时间
举例代码:
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)];
2.NSData
NSData类包含大量字节,可以获得数据的长度和指向字节起始位置的指针
NSData是一个对象,适用于常规的内存管理行为,可以写成自动释放对象
NSData是不可改变的,被创建后就不能改变,可以使用但不能更改其中内容
NSMutableData支持在数据内容中添加和删除字节
举例代码:
NSData *data =[NSData dataWithBytes:string
length:strlen(string)+1];
3.写入和读取属性列表
(1)写入
集合属性列表类(NSArray、NSDictionary)具有一个-writeToFile:atomically;方法用于将属性列表写入文件
NSString和NSData也具有writeToFile:atomically方法,但只能写出字符串或数据块,所以可以写入数组然后再保存数组
举例代码:
NSArray *phrase;
phrase = [NSArray arrayWithObjects:@"I",@"AM",@"DE",@"WEI",@"I'M ",@"29",@"YEARS",@"OLD",nil];
[phrase writeToFile:@"/tmp/xxxxx.plist" atomically:YES];
Tip:atomically为YES时保存过程中会占用双倍的硬盘空间来保存文件
执行后会生成plist文件,可以使用Xcode自带的属性列表编辑器编辑
有些plist文件是以二进制压缩保存的,可以使用plutil -convert xml1 filename.plist转换一下再阅读
(2)读取
使用-arrayWithContentsOfFile方法读取文件(因为只能用数组保存所以返回的也会是数组)
举例代码:
NSArray *phrase = [NSArray arrayWithContentsOfFile:@"tmp/xxx.plist"];
NSLog(@"%@",phrase);
(3)最简单的保存
可使用NSData的writeToFile:atomically转换
不过这个方法不返回任何错误信息,如果不能加载文件只能得到nil指针,不能确定出现了何种错误
二、编码对象
将对象自身的实例变量和其他数据编码为数据块保存到磁盘,或者将数据块度回到内存并基于数据创建新对象,称为序列化和反序列化 等价于 编码和解码
对于任何Objective-C都是用encodeObject:forKey;进行编码
恢复某个对象,可以使用decodeSomethingForKey方法
如果对象不是属性列表类型,则采用NSCoding协议和实现方法来编码和解码对象
采用NSCoding协议意味着必须实现encodeWithCoder和initWithCoder方法
举例代码:
#import <Foundation/Foundation.h>
@interface Thingie : NSObject <NSCoding> {
NSString *name;
int magicNumber;
float shoeSize;
NSMutableArray *subThingies;
}
@property (copy) NSString *name;
@property intmagicNumber;
@property float shoeSize;
@property (retain) NSMutableArray *subThingies;
- (id)initWithName: (NSString *) n
magicNumber: (int) mn
shoeSize: (float) ss;
@end // Thingie
@implementationThingie
@synthesize name;
@synthesizemagicNumber;
@synthesize shoeSize;
@synthesizesubThingies;
- (id)initWithName: (NSString *) n
magicNumber: (int) mn
shoeSize: (float) ss {
if (self = [super init]) {
self.name = n;
self.magicNumber = mn;
self.shoeSize = ss;
self.subThingies = [NSMutableArray array];
}
return (self);
}
- (void) dealloc {
[name release];
[subThingies release];
[super dealloc];
} // dealloc
- (void) encodeWithCoder: (NSCoder *) coder {
[coder encodeObject: name
forKey: @"name"];
[coder encodeInt: magicNumber
forKey: @"magicNumber"];
[coder encodeFloat: shoeSize
forKey: @"shoeSize"];
[coder encodeObject: subThingies
forKey: @"subThingies"];
} // encodeWithCoder
- (id) initWithCoder: (NSCoder *) decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey: @"name"];
self.magicNumber = [decoder decodeIntForKey: @"magicNumber"];
self.shoeSize = [decoder decodeFloatForKey: @"shoeSize"];
self.subThingies = [decoder decodeObjectForKey: @"subThingies"];
}
return (self);
} // initWithCoder
- (NSString *) description {
NSString*description =
[NSString stringWithFormat: @"%@: %d/%.1f %@",
name, magicNumber, shoeSize, subThingies];
return(description);
} // description
@end // Thingie
使用NSKeyArchiver把对象归档到NSData中,
keyedArchiver使用键/值对保存对象的信息
archivedDataWithRootObject方法,先在后台创建一个NSKeyedArchiver实例,然后将实例传递给-encodeWithCoder
方法,方法复制自身属性时,可以对其他对象也进行编码
Objective-C学习笔记第十五章文件加载与保存相关推荐
- 【机器学习-周志华】学习笔记-第十五章
记录第一遍没看懂的 记录觉得有用的 其他章节: 第一章 第三章 第五章 第六章 第七章 第八章 ...
- 机器学习理论《统计学习方法》学习笔记:第五章 决策树
机器学习理论<统计学习方法>学习笔记:第五章 决策树 决策树 5.1 决策树模型与学习 5.1.1 决策树模型 5.1.2 决策树与if-then规则 5.1.3 决策树与条件概率分布 5 ...
- JavaScript学习笔记(十五)
JavaScript学习笔记(十五) 事件 事件是DOM(文档对象模型)的一部分.事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别. 一.事件流 1.冒泡型事件 IE上的解决方案就是 ...
- OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()
OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...
- MATLAB学习笔记(十五)
MATLAB学习笔记(十五) 一.非线性方程求解与函数极值计算 1.1 非线性方程数值求解 1.2 函数极值的计算 1.2.1 无约束最优化问题 1.2.2 有约束最优化问题 一.非线性方程求解与函数 ...
- 学习笔记(十五)——镜像的知识点与注意事项
学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...
- R语言实战笔记--第十五章 处理缺失数据
R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...
- [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册
1.实现功能-完成用户登录 在redis手动添加测试用户,并画出示意图以及说明注意事项(后续通过程序注册用户) 如:输入用户名和密码,如果在redis中存在并正确,则登录,否则退出系统,并给出相应提示 ...
最新文章
- np.array_split 方法也可以分割列表list,如下
- 掩码计算工具netmask
- 电脑安全注意事项_别墅装修设计注意事项 别墅装修的陷阱有哪些
- Factory Method工厂方法模式
- 由于目标计算机积极拒绝,无法连接。 192.168.1.106:8078 说明: 执行当前 Web 请求期间,出现未经处理的异常。...
- Java高并发BlockingQueue重要的实现类
- 找到的程序集的清单定义与程序集引用不匹配
- 忽略证书_中专考生注意!忽略这一点,四科全过也拿不到执业药师证书!
- ERP计划参数如何在线更新
- AD域、Windows AD域管理功能大全
- 绘制盐沼植被图的混合方法-文献阅读
- 石川:异象、因子和多因子模型
- 提高办公协同效率,Tracup可能是最好的选择
- xnote1.5——WebShell
- Phalanx HDU 【2859】
- veracrypt 创建文件型加密卷
- 五千字聊一聊接口测试
- count(*)和count(1)和count(字段)的区别
- mp2格式怎么转换mp3?
- 中科大何向南团队+快手App联合出品 KuaiRec | 快手首个稠密为99.6%的数据集 | 相关介绍、下载、处理、使用方法
热门文章
- 智慧楼宇系统如何帮助产业园区破解招商难题?
- css 自定义字体 Internet Explorer,Firefox,Opera,Safari
- 图像处理软件--利用PR将视频保存成一系列图片
- 拼多多携手渭南邮政,开辟农产品上行极速通道
- 模电multisim的1.6.1的例题实验演示
- Android 和 iOS分别用同一个 QQ登录获取到的openid 不一致的问题
- java秒表代码_秒表 - java代码库 - 云代码
- 鬼谷子七十二术(完整版)值得永久收藏!终生研读!
- 助力私募行业高质量发展,华西证券“金华彩杯”年度盛会即将启幕
- 从零开始学Python:第十二课-常用数据结构之元组