第十章 屬性列表
說明: “Objective-C編程人員可以使用與C綁定的所有工具,例如標準C庫函數(shù)??梢允褂胢alloc() 和 free()函數(shù)處理動態(tài)內(nèi)存管理問題,或者使用 open(), read(), write(), fopen()和 fread()函數(shù)處理文件。 ”
屬性列表類包括 NSArray、NSDictionary、NSString、NSNumber、NSDate 和 NSData。
10.1 NSDate
NSDate 是用于處理日期和時間的基礎(chǔ)類??梢允褂肹NSDate date];獲取當(dāng)前的日期和時間,它是一個 自動釋放對象。以下代碼:
NSDate *date = [NSDate data];
NSLog (@”today is %@”, date);
將輸出:
Today is 2009-11-10 19:23:02
還可以獲取與當(dāng)前時間相隔一定時差的日期。例如,24 小時之間的確切日期
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24*60*60) ];
NSLog (@”yesterday is %@”, yesterday);
將輸出
Yesterday is 2009-11-19 19:23:02
+dateWithTimeIntervalSinceNow: 接受一個 NSTimeInterval 參數(shù), 該參數(shù)是一個雙精度值, 表示以秒為 單位的時間間隔。通過該參數(shù)可以指定時間偏移的方式:對于將來的時間,使用正的時間間隔;對于過去 的時間,使用負的時間間隔。
10.2 NSData
NSData 類包裝了大量字節(jié)。我們可以獲得數(shù)據(jù)的長度和指向字節(jié)起始位置的指針。下面的NSData 對 象將保存一個普通的C字符串(一個字節(jié)序列) ,然后輸出數(shù)據(jù):
const char *string = “Hi there, this is a C string!”;
NSData *data = [NSData dataWithBytes:string length: strlen(string) + 1];
NSLog(@”data is %@”, data);
輸出結(jié)果:
data is <4869.... ....... 2100>
這是一個十六進制數(shù)據(jù)塊實際上就是上面的字符串, 0x48 代表字符 H,0x69 代表字符 i,等等。 strlen(string) + 1 中的“+1”用于包含 C 字符串所需的尾部的零字節(jié)(輸出結(jié)果末尾的00)。
可以使用%s 格式的說明符輸出字符串:
NSLog (@”%d bytes string is ‘%s’ ”, [data length], [data bytes]);
//-length 方法給出字節(jié)數(shù) -bytes 方法給出指向字符串起始位置的指針
輸出結(jié)果如下所示:
30 bytes string is ‘Hi there, this is a C string! ’
NSData 對象是不可改變的, 它們被創(chuàng)建后就不能改變。NSMutableData 支持在數(shù)據(jù)內(nèi)容中添加和刪除
字節(jié)。
10.3 寫入和讀取屬性列表
集合屬性列表類(NSArray、NSDictionary)具有一個-writeToFile: atomically: 方法,用于將屬性列表
寫入文件。NSString 和 NSData 也具有 writeToFile: atomically: 方法,但是只能寫出字符串和數(shù)據(jù)塊。
因此,我們可以將字符串存入一個數(shù)組,然后保存該數(shù)組:
NSArray *phrase;
phrase = [NSArray arrayWithObjects:@”I”, @”seem”, @”to”, @”be”, @”a”, @”verb”, nil ];
[phrase writeToFile: @”/tmp/verbiage.txt” atomically: YES];
現(xiàn)在如果看一下文件/tmp/verbiage.txt,應(yīng)該可以看到如下代碼: //***********************************************************************************************//
<?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> //***********************************************************************************************//
雖然繁瑣, 但是正是我們要保存的內(nèi)容: 一個字符串?dāng)?shù)組。 這些屬性列表文件可以為任意復(fù)雜的式,形 可以包含字符串、數(shù)字和日期數(shù)組的字典數(shù)組。
現(xiàn)在已經(jīng)將 verbiage.txt 文件保存在了磁盤上,可以使用 +arrayWithContentsOfFile: 方法讀取該文件。 代碼如下所示:
NSArray *phrase2 = [NSArray arrayWithContentsOfFile:@” /tmp/verbiage.txt”];
NSLog (@”%@”, phrase2);
輸出結(jié)果正好與前面保存的形式相匹配:
(
I,
seem,
to,
be,
a,
verb
)
writeToFile: 方法中的 atomically: 參數(shù)的值為 BOOL 類型, 用于通知是否應(yīng)該首先將文件保存在臨時 文件中,當(dāng)文件成功保存后,再將該臨時文件和原始文件交換。這是一種安全機制。