OC 中的数据存储
OC 中的数据存储
[toc]
plist 文件
属性列表
C 提供了 open()、read()、write()、fopen()、fread()
这些函数创建、读取和写入文件
而 Cocoa 提供了两个处理文件的通用类:属性列表和对象编码
在 Cocoa 中有一类名为属性列表(property list)的对象,简写为 plist。这些对象用来存放一些 Cocoa 能够处理的对象,比如NSArray、NSNumber、NSDictionary、NSString、NSData、NSDate
主要是将这些对象存储到文件中或从文件中加载。
下面来熟悉一下 NSDate 和 NSData 的使用。
NSDate 类是 Cocoa 中用来处理日期和时间的基础类,[NSDate date] 能够获取当前的日期和时间,它能够返回一个自动释放的对象。
NSDate *date = [NSDate date];
NSLog(@"today is %@", date); //today is Mon Jun 27 11:31:52 2022
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)];
NSLog(@"yesterday now is %@", yesterday); //yesterday now is Sun Jun 26 11:37:39 2022
NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow: (24 * 60 * 60)];
NSLog(@"tomorrow now is %@", tomorrow); //tomorrow now is Tue Jun 28 11:37:39 2022
NSData 类可以包含大量字节,你可以获得数据的长度和指向字节起始位置的指针。
const char *string = "Hi there, this is a C string!";
NSData *data = [NSData dataWithBytes: string length: strlen(string) + 1];
NSLog(@"data is %@", data); //data is {length = 30, bytes = 0x48692074 68657265 2c207468 69732069 ... 73747269 6e672100 }
NSLog(@"%d byte string is '%s'", [data length], [data bytes]); //30 byte string is 'Hi there, this is a C string!'
写入的读取属性列表
集合型属性列表类(NSArray 和 NSDictionary)具有一个 - writeToFile: atomically:
的方法用于将属性列表的内容写入文件。
NSString 和 NSData 也有 writeToFile: atomically:
的方法,不过只能写出字符串和数据块
NSArray *phrase;
phrase = [NSArray arrayWithObjects: @"I", @"seem", @"to", @"be", @"a", @"verb", nil];
[phrase writeToFile:@"/tmp/verbiage.txt" atomically:YES];
然后打开 Finder,按下 commond + shift + G 输入 /tmp
回车,会看到 verbiage 文件,打开能看到以下内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>I</string>
<string>seem</string>
<string>to</string>
<string>be</string>
<string>a</string>
<string>verb</string>
</array>
</plist>
可以使用 +arrayWithContentsOffFile:
方法读取该文件。会出现一些结果:
(
I,
seem,
to,
be,
a,
verb
)
要注意 writeToFile
中的 atomically
,它的参数类型为 BOOL 型,它会告诉 Cocoa 是否先将文件内容保存在临时文件中,然后再将原始文件与临时文件交换,这是一种安全机制,如果在保持的过程出现意外的话,不会破坏原始文件。但是这种方法的缺点是会消耗两倍的内存空间,除非要保存的文件非常大的话,应该始终用 atomically
方式保存文件。
NSUserDefaults(偏好设置,本质是plist)
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。
NSUserDefaults 可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefaults 存储
NSKeyedArchiver(归档)
采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder:方法。
前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
缺点:
归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
注: initWithCoder什么时候需要调用[super initWithCoder:]
• initWithCoder原理:只要解析文件就会调用,xib,storyboard都是文件,因此只要解析这两个文件,就会调用initWithCoder。
• 因此如果在storyboard使用自定义view,重写initWithCoder方法,一定要调用[super initWithCoder:],因为只有系统才知道怎么解析storyboard,如果没有调用,就解析不了这个文件。
NSFileManage文件管理(沙盒)
App所产生的数据都存在于自己的沙盒中,一般沙盒都有3个文件:Documents
、Library
和tmp
。
Documents
:这个目录存放用户数据。存放用户可以管理的文件;iTunes备份和恢复的时候会包括此目录。
Library
:主要使用它的子文件夹,我们熟悉的NSUserDefaults就存在于它的子目录中。
Library/Caches
:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除,“删除缓存”一般指的就是清除此目录下的文件。
Library/Preferences
:NSUserDefaults的数据存放于此目录下。
tmp
:App应当负责在不需要使用的时候清理这些文件,系统在App不运行的时候也可能清理这个目录。
NSBundle
对于bundle可以理解为一个捆绑包,我们的可执行(executable)工程,打包完之后,也是一个捆绑包,我们称之为主bundle,这个主bundle包含了可执行代码,如各个viewcontroller的可执行代码,和相关资源例如图片资源等。
NSBundle这个类其实就是用来定位可执行资源的。获取到具体的可执行文件的位置,然后再加载。因此,NSBundle的使用,只限制于拥有独立的bundle空间的(