OC基础回顾(十四)文件加载与保存

本文详细介绍了Objective-C中属性列表的处理,包括NSDate的比较和时间获取,NSData的使用,以及属性列表的读写。进一步讨论了对象编码、键值编码(KVC)的概念和使用,如KVC的自动标量包装特性。同时,文章还讲解了NSPredicate的创建、谓词运算符的使用,以及如何处理未定义的键。
摘要由CSDN通过智能技术生成

Cocoa提供两个处理文件的通用类:属性列表和对象编码。

1.属性列表

在Cocoa中,有一个类名为属性列表(property list)的对象,通常简写为plist。这些列表包含 Cocoa知道如何操作的一组对象。具体来讲,Cocoa知道如何将它们保存到文件中并进行加载。属性列表类包括NSArray、NSDictionary、NSString、NSNumber、NSDate和NSData,以及它们的可修改形态变体(只要它们拥有前缀为Mutable的类)。

1.1 NSDate

NSDate是Cocoa中用于处理日期和时间的基础类。
1.1.1 获取当前日期和时间
可以使用[NSDate date]获取当前的日期和时间,它是一个自动释放的对象。因此,以下代码:
    NSDate *currentDate = [NSDate date];
    NSLog(@"crrent date:%@",currentDate);
将输出如下结果:
crrent date:2015-08-26 08:46:33 +0000

1.1.2 比较两个时间

可以使用一些方法比较两个日期,从而对列表进行排序。例如下面代码:
-(int)compareDate:(NSString*)date01 withDate:(NSString*)date02{
    int ci;
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *dt1 = [[NSDate alloc] init];
    NSDate *dt2 = [[NSDate alloc] init];
    dt1 = [df dateFromString:date01];
    dt2 = [df dateFromString:date02];
    NSComparisonResult result = [dt1 compare:dt2];
    switch (result)
    {
        //date02比date01大
        case NSOrderedAscending: ci=1; break;
        //date02比date01小
        case NSOrderedDescending: ci=-1; break;
        //date02=date01
        case NSOrderedSame: ci=0; break;
        default: NSLog(@"erorr dates %@, %@", dt2, dt1); break;
    }
    return ci;
}

1.1.3  使用+dateWithTimeIntervalSinceNow方法获取特定时间

+dateWithTimeIntervalSinceNow: 接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔。通过该参数可以指定时间偏移的方式:对于将来的时间,使用正的时间间隔。对于过去的时间,使用负的时间间隔。
使用:
可以使用该方法获取与当前时间间隔一定时差的日期 比如,获取24小时之前的确切时间:
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24 * 60 *60)];
NSLog(@“yesterday is %@“,yesterday);
输出如下结果:
yesterday is 2015-08-25 08:51:29 +0000

如果想要设定输出结果的时间格式,使用NSDateFormatter类

1.2 NSData

NSData包装了大量字节。你可以获得数据的长度和指向字节起始位置的指针。因为NSData是一个对象,适用于常规的内存管理行为。因此,如果将数据库传递给一个函数或方法,可以通过传递一个自动释放的NSData来实现,无需担心内存清楚问题。下面的NSData对象将保存一个普通的C字符串(一个字节序列),然后输出数据:
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 <48692074 68657265 2c207468 69732069 73206120 43207374 72696e67 00>

说明:
-length方法给出字节数量,-byte方法给出指向字符串起始位置的指针。注意+dataWithBytes:调用中的+1,它用于包含C字符串所需的尾部的零字节。还要注意NSLog输出结果末尾的00.通过包含零字节,就可以使用%s格式的说明符输出字符串。

NSLog(@“%d byte string is %s”,[data length], [data bytes]);
输出结果如下:
30 byte stirng is Hi there , there is a C string"

NSData对象是不可变更的,创建之后就不能改变。你可以使用它们,但是不能更改其中的内容。不过NSMutableData支持在数据内容中添加和删除字节。

1.3 属性列表的写入和读取

      集合属性列表类(NSArray、NSDictionary)具有一个-writeToFile:atomically:方法,用具将属性列表写入文件。NSString和NSData也具有writeToFile:atomically:方法,但它只能写出字符串或数据块。
   因此,可以将字符串存入一个数组,然后保存该数组:
NSArray *phrase = [NSArray arrayWithObjects:@“I”,@“seem”,@“to”,@“be”,@“a”,@“verb”,nil];
[phrase writeToFile:@“/tmp/verbiage.txt”  atomically:YES];
该文件的内容为:
<?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <array>
5     <string>I</string>
6     <string>seem</string>
7     <string>to</string>
8     <string>be</string>
9     <string>a</string>
10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值