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 |