第十五章文件加载与保存
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学习笔记第十五章文件加载与保存相关推荐

  1. 【机器学习-周志华】学习笔记-第十五章

    记录第一遍没看懂的 记录觉得有用的 其他章节:         第一章         第三章         第五章         第六章         第七章         第八章      ...

  2. 机器学习理论《统计学习方法》学习笔记:第五章 决策树

    机器学习理论<统计学习方法>学习笔记:第五章 决策树 决策树 5.1 决策树模型与学习 5.1.1 决策树模型 5.1.2 决策树与if-then规则 5.1.3 决策树与条件概率分布 5 ...

  3. JavaScript学习笔记(十五)

    JavaScript学习笔记(十五) 事件 事件是DOM(文档对象模型)的一部分.事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别. 一.事件流 1.冒泡型事件 IE上的解决方案就是 ...

  4. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

    OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...

  5. MATLAB学习笔记(十五)

    MATLAB学习笔记(十五) 一.非线性方程求解与函数极值计算 1.1 非线性方程数值求解 1.2 函数极值的计算 1.2.1 无约束最优化问题 1.2.2 有约束最优化问题 一.非线性方程求解与函数 ...

  6. 学习笔记(十五)——镜像的知识点与注意事项

    学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...

  7. cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

    cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...

  8. R语言实战笔记--第十五章 处理缺失数据

    R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...

  9. [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册

    1.实现功能-完成用户登录 在redis手动添加测试用户,并画出示意图以及说明注意事项(后续通过程序注册用户) 如:输入用户名和密码,如果在redis中存在并正确,则登录,否则退出系统,并给出相应提示 ...

最新文章

  1. np.array_split 方法也可以分割列表list,如下
  2. 掩码计算工具netmask
  3. 电脑安全注意事项_别墅装修设计注意事项 别墅装修的陷阱有哪些
  4. Factory Method工厂方法模式
  5. 由于目标计算机积极拒绝,无法连接。 192.168.1.106:8078 说明: 执行当前 Web 请求期间,出现未经处理的异常。...
  6. Java高并发BlockingQueue重要的实现类
  7. 找到的程序集的清单定义与程序集引用不匹配
  8. 忽略证书_中专考生注意!忽略这一点,四科全过也拿不到执业药师证书!
  9. ERP计划参数如何在线更新
  10. AD域、Windows AD域管理功能大全
  11. 绘制盐沼植被图的混合方法-文献阅读
  12. 石川:异象、因子和多因子模型
  13. 提高办公协同效率,Tracup可能是最好的选择
  14. xnote1.5——WebShell
  15. Phalanx HDU 【2859】
  16. veracrypt 创建文件型加密卷
  17. 五千字聊一聊接口测试
  18. count(*)和count(1)和count(字段)的区别
  19. mp2格式怎么转换mp3?
  20. 中科大何向南团队+快手App联合出品 KuaiRec | 快手首个稠密为99.6%的数据集 | 相关介绍、下载、处理、使用方法

热门文章

  1. 智慧楼宇系统如何帮助产业园区破解招商难题?
  2. css 自定义字体 Internet Explorer,Firefox,Opera,Safari
  3. 图像处理软件--利用PR将视频保存成一系列图片
  4. 拼多多携手渭南邮政,开辟农产品上行极速通道
  5. 模电multisim的1.6.1的例题实验演示
  6. Android 和 iOS分别用同一个 QQ登录获取到的openid 不一致的问题
  7. java秒表代码_秒表 - java代码库 - 云代码
  8. 鬼谷子七十二术(完整版)值得永久收藏!终生研读!
  9. 助力私募行业高质量发展,华西证券“金华彩杯”年度盛会即将启幕
  10. 从零开始学Python:第十二课-常用数据结构之元组