NSLog的格式如下所示:
- %@ 对象
- %d, %i 整数
- %u 无符整形
- %f 浮点/双字
- %x, %X 二进制整数
- %o 八进制整数
- %zu size_t
- %p 指针
- %e 浮点/双字 (科学计算)
- %g 浮点/双字
- %s C 字符串
- %.*s Pascal字符串
- %c 字符
- %C unichar
- %lld 64位长整数(long long)
- %llu 无符64位长整数
- %Lf 64位双字
iPhone开发基础教程这本书介绍,常用的数据存储方式有三种:
属性列表,是指用基本数据结构如NSArray,NSDictnary等封装的writetoFile接口,把数据写入到plist,注意这种方式只支持基础数据类型,不多做介绍
对象归档(归档这个名字有点怪,是对archive的翻译),比较常用,主要对这种方式做个介绍。
SQLite3,个人认为不好用,不是特殊的应用情境也不需要SQL的强大功能,不介绍。
对象归档使用方法
NSCoding和NSCoder
要对自定义类型做归档,那么它必须实现NSCoding协议,实现如下两个接口:
- (id)initWithCoder:(NSCoder *)coder;
- (void)encodeWithCoder:(NSCoder *)coder;
SCoder是archivie 字节流的抽象类.我们可以实现把数据写入一个coder,也可以从coder中读取我们写入的数据. 我们对象的方法initWithCoder:就是从一个coder从读取数据,然后把数据赋给成员变量. 方法encodeWithCoder: 则是把成员变量的值写入到coder中.
NSCoder是一个抽象类,我们不会直接使用它来创建对象. 相反,我们会使用从它继承来的子类. 也就是我们使用 NSKeyedUnarchiver类来从字节流中读取数据,而使用NSKeyedArchiver类来把对象写入到字节流
相关接口介绍
EncodeObject : forkey,一类的接口,其中forkey是对数据的标识,encode时对某个数据段加入key标识,decode时用key标识解码对应数据。
存在EncodeObject和DecodeObject一对的不需要forkey参数的接口,不用key标识也是没有问题的。不过需要注意:
- Encode和Decode时,数据编码、解码的顺序必须一致,因为文件中的数据是顺序的存取。
- 如果Decode阶段比Encode阶段多了一个数据段,那这个数据类型解码出来是null为空的。
关于存储路径:
Document文件夹,需要了解IOS沙盒,是什么原因让它只能访问自己程序域内数据。
使用示例:
//Archive
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:data];
[archiver encodeObject:fourLines forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[fourLines release];
[archiver release];
[data release];
//Unarchive
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
NSData *data = [[NSMutableData alloc]
initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
FourLines *fourLines = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];
field1.text = fourLines.field1;
field2.text = fourLines.field2;
field3.text = fourLines.field3;
field4.text = fourLines.field4;
[unarchiver release];
[data release];
}