NSLOG Format串含义和对数据做文件存储

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];       
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值