版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)第第19章章 歸檔歸檔 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)目錄目錄v19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔v19.2 使用使用NSKeyedArchiver歸檔歸檔v19.3 編碼方法和解碼方法編碼方法和解碼方法v19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案v19.5 使用歸檔程序復(fù)制對(duì)象使用歸檔程序復(fù)制對(duì)象武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔vMac OS X上的應(yīng)用程序使用上的應(yīng)用程序使用XML屬性列
2、表屬性列表或或plists)來(lái)存儲(chǔ)諸如默認(rèn)參數(shù)選擇、應(yīng)用程來(lái)存儲(chǔ)諸如默認(rèn)參數(shù)選擇、應(yīng)用程 序序設(shè)置和配置信息這樣的數(shù)據(jù),因而,了解如何創(chuàng)設(shè)置和配置信息這樣的數(shù)據(jù),因而,了解如何創(chuàng)建和讀回這些數(shù)據(jù)很有用。然而,這些列表建和讀回這些數(shù)據(jù)很有用。然而,這些列表 的的歸檔用途是有限的,因?yàn)楫?dāng)為某個(gè)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建歸檔用途是有限的,因?yàn)楫?dāng)為某個(gè)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建屬性列表時(shí),沒(méi)有保存特定的對(duì)象類,沒(méi)有屬性列表時(shí),沒(méi)有保存特定的對(duì)象類,沒(méi)有 存存儲(chǔ)對(duì)同一對(duì)象的多個(gè)引用,也沒(méi)有保持對(duì)象的可儲(chǔ)對(duì)同一對(duì)象的多個(gè)引用,也沒(méi)有保持對(duì)象的可變性。變性。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用X
3、ML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔v如果你的對(duì)象是如果你的對(duì)象是NSString、NSDictionary, NSArray、NSData或或NSNumber對(duì)象,你對(duì)象,你可以使可以使 用在這些類中實(shí)現(xiàn)的用在這些類中實(shí)現(xiàn)的writeToFile:atomically:方法將數(shù)據(jù)寫到文方法將數(shù)據(jù)寫到文件中。在寫出某個(gè)字典或數(shù)組件中。在寫出某個(gè)字典或數(shù)組 的情況下,該方的情況下,該方法可以使用法可以使用XML厲性列衷的格式寫出數(shù)據(jù)。代厲性列衷的格式寫出數(shù)據(jù)。代碼清單碼清單19-1顯示了如何將在第顯示了如何將在第15 章章“數(shù)字、數(shù)字、字符串和集合字符串和集合“中作為簡(jiǎn)易術(shù)語(yǔ)表而創(chuàng)建的字典中作為
4、簡(jiǎn)易術(shù)語(yǔ)表而創(chuàng)建的字典作為屬性列表寫入文件中。作為屬性列表寫入文件中。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔#import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSDictionary *glossary =NSDictionary dictionaryWithObjectsAndKeys:”A class defined so oth
5、er classes can inherit from it.”, ”abstract class”,”To implement all the methods defined in a protocol”, ”adopt”,”Storing an object for later use. “, ”archiving”,nil;if (glossary writeToFile: ”glossary” atomically: YES = NO)NSLog (”Save to file failed!”);pool drain;return 0;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0
6、程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔writeToFile:atomically:消息被發(fā)送給字典對(duì)消息被發(fā)送給字典對(duì)象象glossary,使字典以屬性列表使字典以屬性列表 的形式寫到文的形式寫到文件件glossary中,中,atomically參數(shù)被設(shè)為參數(shù)被設(shè)為YES,表示希望首先將字典寫入臨時(shí)備份文,表示希望首先將字典寫入臨時(shí)備份文 件中,件中,并且一且成功,將把最終數(shù)據(jù)轉(zhuǎn)移到名為并且一且成功,將把最終數(shù)據(jù)轉(zhuǎn)移到名為glossary的指定文件中。這是一種安全措施,的指定文件中。這是一種安全措施, 它保護(hù)文件在一些情況下如系統(tǒng)在執(zhí)行操作的它保護(hù)文件在一些情況下如
7、系統(tǒng)在執(zhí)行操作的過(guò)程中崩潰時(shí)免受破壞。在這種情況下,原始過(guò)程中崩潰時(shí)免受破壞。在這種情況下,原始的的glossary文件如果該文件已存在不會(huì)受文件如果該文件已存在不會(huì)受到損害。到損害。如果查看代碼淸單如果查看代碼淸單19-1中創(chuàng)建的中創(chuàng)建的glossary文件文件,它的內(nèi)容可能如下:,它的內(nèi)容可能如下:武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔abstract classA class defined so other classes can inherit from it.adoptTo implement all th
8、e methods defined in a protocolarchivingStoring an object for later use. 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔v 從所創(chuàng)建的從所創(chuàng)建的XML文件中可以看到,是以一種鍵文件中可以看到,是以一種鍵(.)值值(.) 對(duì)的形式將字典寫入文件的,對(duì)的形式將字典寫入文件的,v 根據(jù)字典創(chuàng)建屬性列表時(shí),字典中的鍵必須全都是根據(jù)字典創(chuàng)建屬性列表時(shí),字典中的鍵必須全都是NSString對(duì)象。數(shù)組中的元素或宇典中對(duì)象。數(shù)組中的元素或宇典中 的值可以是的值可以是NSS
9、tring, NSArray, NSDictionary, NSData, 或或NSNumber對(duì)象。對(duì)象。v 要將文件中的要將文件中的XML屬性列表讀入你的程序,使用屬性列表讀入你的程序,使用dictionaryWithContentsOfFile:或或 arrayWithContentsOfFile:方法。要讀回?cái)?shù)據(jù),使方法。要讀回?cái)?shù)據(jù),使用用dataWithContentsOfFile:方法,要讀回字符串方法,要讀回字符串 對(duì)象,使用對(duì)象,使用stringWithContentsOfFile:方法。代碼方法。代碼淸單淸單19-2讀回了代碼清單讀回了代碼清單19-1中編寫的術(shù)語(yǔ)表中編寫的術(shù)
10、語(yǔ)表, 然后輸然后輸出其內(nèi)容。出其內(nèi)容。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔#import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSDictionary *glossary;glossary = NSDictionary dictionaryWithContentsOfFile: ”glossary”;for ( NS
11、String *key in glossary )NSLog (”%: %”, key, glossary objectForKey: key);pool drain;return 0;輸出:輸出:archiving: Storing an object for later use.abstract class: A class defined so other classes can inherit from it.adopt: To implement all the methods defined in a protocol武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.
12、1 使用使用XML屬性列表進(jìn)行歸檔屬性列表進(jìn)行歸檔v你的屬性列表不必從你的屬性列表不必從Objective-C程序中創(chuàng)建程序中創(chuàng)建,屬性列表可以來(lái)自任何的源??梢允褂煤?jiǎn)單,屬性列表可以來(lái)自任何的源。可以使用簡(jiǎn)單 的文本編輯器,或使用的文本編輯器,或使用Mac OS X系統(tǒng)中位于系統(tǒng)中位于/Developer/Applications/Utilities目錄目錄下的下的Property List Editor程序來(lái)創(chuàng)建屬性列程序來(lái)創(chuàng)建屬性列表。表。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.2 使用使用NSKeyedArchiver歸檔歸檔v在帶鍵的檔案中,每個(gè)歸檔字段都有一
13、個(gè)名稱。在帶鍵的檔案中,每個(gè)歸檔字段都有一個(gè)名稱。歸檔某個(gè)對(duì)象時(shí),會(huì)為它提供一個(gè)名稱,即鍵。歸檔某個(gè)對(duì)象時(shí),會(huì)為它提供一個(gè)名稱,即鍵。從歸檔中檢索該對(duì)象時(shí),是根據(jù)這個(gè)鍵來(lái)檢索它從歸檔中檢索該對(duì)象時(shí),是根據(jù)這個(gè)鍵來(lái)檢索它的。這樣,可以按照任意的順序?qū)?duì)象寫人歸檔的。這樣,可以按照任意的順序?qū)?duì)象寫人歸檔井進(jìn)行檢素。另外,如果向類添加了新的實(shí)例變井進(jìn)行檢素。另外,如果向類添加了新的實(shí)例變量或刪除了實(shí)例變量,程序也可以進(jìn)行處理。量或刪除了實(shí)例變量,程序也可以進(jìn)行處理。v代碼清單代碼清單19-3展示了如何使用展示了如何使用NSKeyedArchiver類中的類中的archiveRootObject:t
14、oFile:方法將方法將 glossary存儲(chǔ)到磁盤上,要使用該類,在你的存儲(chǔ)到磁盤上,要使用該類,在你的程序中包含以下文件程序中包含以下文件v #import 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.2 使用使用NSKeyedArchiver歸檔歸檔#import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSDictionary *glossary =NSDictionar
15、y dictionaryWithObjectsAndKeys:”A class defined so other classes can inherit from it”,”abstract class”,”To implement all the methods defined in a protocol”,”adopt”,”Storing an object for later use”,”archiving”,nil;NSKeyedArchiver archiveRootObject: glossary toFile: ”glossary.archive”;pool release;re
16、turn 0;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.2 使用使用NSKeyedArchiver歸檔歸檔代碼淸單代碼淸單19-3并不在終端產(chǎn)生任何輸出,但是語(yǔ)句并不在終端產(chǎn)生任何輸出,但是語(yǔ)句NSKeyedArchiver archiveRootObject: glossary toFile: ”glossary.archive”;將字典將字典glossary寫入文件寫入文件glossary.archive中。可以為該文件指定任何路徑名,在本中??梢詾樵撐募付ㄈ魏温窂矫诒纠?,文件被寫入當(dāng)前目錄下。例中,文件被寫入當(dāng)前目錄下。以后通過(guò)以后通過(guò)NSKeyedUuar
17、chiver的的unArChiveObjectWithFile:方法將創(chuàng)建的歸檔方法將創(chuàng)建的歸檔文件讀人執(zhí)行程序中,如代碼清單文件讀人執(zhí)行程序中,如代碼清單19-4所示。所示。#import #import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSDictionary *glossary;glossary = NSKeyedUnarchiver unarchiveObjectWithFile:”
18、glossary.archive”;for ( NSString *key in glossary )NSLog (”%: %”, key, glossary objectForKey: key);pool drain;return 0;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.2 使用使用NSKeyedArchiver歸檔歸檔v19.4輸出:輸出:v abstract class: A class defined so other classes can inherit from it.v adopt: To implement all the methods defi
19、ned in a protocolv archiving: Storing an object for later use.v語(yǔ)句語(yǔ)句;glossary = NSKeyedUnarchiver unarchiveObjectWithFile: ”glossary.archive”;v將指定的文件打開(kāi)并讀取文件的內(nèi)容。該文件必須是前面歸檔操作的結(jié)果。可以為文將指定的文件打開(kāi)并讀取文件的內(nèi)容。該文件必須是前面歸檔操作的結(jié)果??梢詾槲募付ㄍ昙付ㄍ?整路徑名或相對(duì)路徑名,如本例所示。整路徑名或相對(duì)路徑名,如本例所示。v在恢復(fù)在恢復(fù)glossary之后,程序可以簡(jiǎn)單地通過(guò)枚舉其內(nèi)容來(lái)驗(yàn)證恢復(fù)是否成功
20、。之后,程序可以簡(jiǎn)單地通過(guò)枚舉其內(nèi)容來(lái)驗(yàn)證恢復(fù)是否成功。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v要?dú)w檔前面沒(méi)有列出的對(duì)象,必須告知系統(tǒng)如何要?dú)w檔前面沒(méi)有列出的對(duì)象,必須告知系統(tǒng)如何歸檔或編碼你的對(duì)象,以及如何解歸歸檔或編碼你的對(duì)象,以及如何解歸 檔檔或解碼它們。這是按照或解碼它們。這是按照協(xié)議,協(xié)議,在類定乂中添加在類定乂中添加encodeWithCoder:方法和方法和 initWithCoder:方法實(shí)現(xiàn)的。對(duì)于我們地址簿方法實(shí)現(xiàn)的。對(duì)于我們地址簿的例子,必須向的例子,必須向AddressBook類和類和AddressCar
21、d類添類添 加這些方法。加這些方法。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v每次歸檔程序想要根據(jù)指定類編碼對(duì)象時(shí),都將每次歸檔程序想要根據(jù)指定類編碼對(duì)象時(shí),都將調(diào)用調(diào)用encodeWithCoder:方法,該方法告知方法,該方法告知 歸檔程序如何進(jìn)行歸檔。類似地,毎次從指定的歸檔程序如何進(jìn)行歸檔。類似地,毎次從指定的類解碼對(duì)象時(shí),就會(huì)調(diào)用類解碼對(duì)象時(shí),就會(huì)調(diào)用initWithCoder方法方法。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v一般而言,編碼方法應(yīng)該指定如何
22、歸檔想要保存一般而言,編碼方法應(yīng)該指定如何歸檔想要保存的對(duì)象中的每個(gè)實(shí)例變量。幸運(yùn)的是,這的對(duì)象中的每個(gè)實(shí)例變量。幸運(yùn)的是,這 些都些都有幫助可査。對(duì)于前面描述的基本有幫助可査。對(duì)于前面描述的基本Objective-C類,可以使用類,可以使用encodeObject:forKey:方法方法。相。相 反,對(duì)于基本的反,對(duì)于基本的C數(shù)據(jù)類型如整型和浮點(diǎn)數(shù)據(jù)類型如整型和浮點(diǎn)型),可以使用表型),可以使用表19-1中列出的某種方法。解中列出的某種方法。解碼方法碼方法initWlthCoder:的工作方式正好相反:的工作方式正好相反:它使用它使用decodeObjecUorKey:來(lái)解碼基本的來(lái)解碼基本
23、的Objective-C類類 使用下表列出的相應(yīng)解瑪方法使用下表列出的相應(yīng)解瑪方法來(lái)解碼基本的數(shù)據(jù)類型。來(lái)解碼基本的數(shù)據(jù)類型。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 代碼清單代碼清單19-5為為AddressCard類和類和AddressBook類都添加了兩個(gè)編碼和解碼方法類都添加了兩個(gè)編碼和解碼方法v #import v #import v #import v interface AddressCard: NSObject
24、 v v NSString *name;v NSString *;v v property (copy, nonatomic) NSString *name, *;v -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail;v -(NSComparisonResult) compareNames: (id) element;v -(void) print;v / Additional methods for NSCopying protocolv -(AddressCard *) copyWithZone: (
25、NSZone *) zone;v -(void) retainName: (NSString *) theName andEmail: (NSString *) theEmail;v end武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 下面是要添加到下面是要添加到AddressCard類實(shí)現(xiàn)文件的兩個(gè)新方類實(shí)現(xiàn)文件的兩個(gè)新方法:法:v -(void) encodeWithCoder: (NSCoder *) encoderv v encoder encodeObject: name forKey: ”AddressCardName”
26、;v encoder encodeObject: forKey: ”AddressCardEmail”;v v -(id) initWithCoder: (NSCoder *) decoderv v name = decoder decodeObjectforKey: ”AddressCardName” retain;v = decoder decodeObjectforKey: ”AddressCardEmail” retain;v return self;v 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v該程序向編碼方法該程序向編
27、碼方法encodeWithCoder:傳人一傳人一個(gè)個(gè)NSCoder對(duì)象作為參數(shù)。由干對(duì)象作為參數(shù)。由干AddressCard類類 直接繼承自直接繼承自Nsobject,所以,所以無(wú)需擔(dān)心編碼繼承的實(shí)例變量。如果的確擔(dān)心,無(wú)需擔(dān)心編碼繼承的實(shí)例變量。如果的確擔(dān)心,并且知道類的子類符合并且知道類的子類符合NSCoding協(xié)議的要求協(xié)議的要求,那么應(yīng)該用下面的語(yǔ)句開(kāi)始編碼方法,確保繼,那么應(yīng)該用下面的語(yǔ)句開(kāi)始編碼方法,確保繼承的實(shí)例變量也被編碼:承的實(shí)例變量也被編碼:v super encodeWithCoder: encoder;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3
28、 編碼方法和解碼方法編碼方法和解碼方法v 對(duì)于地址簿來(lái)說(shuō),有兩個(gè)名為對(duì)于地址簿來(lái)說(shuō),有兩個(gè)名為name和和email的實(shí)例變的實(shí)例變量。因?yàn)樗鼈兌际橇?。因?yàn)樗鼈兌际荖SString對(duì)象,所以使用對(duì)象,所以使用encodeObjectiforKey:方法依次對(duì)它們進(jìn)行編碼,方法依次對(duì)它們進(jìn)行編碼,然后將這兩個(gè)實(shí)例變量添加到歸檔文件中。然后將這兩個(gè)實(shí)例變量添加到歸檔文件中。v encodeObjectforKey:方法編碼對(duì)象并將其存儲(chǔ)在指方法編碼對(duì)象并將其存儲(chǔ)在指定的鍵下,以后可使用該鍵檢索對(duì)象。定的鍵下,以后可使用該鍵檢索對(duì)象。 鍵名是任意的,鍵名是任意的,所以只要在檢索編碼數(shù)據(jù)時(shí)使用的名稱與
29、歸檔編所以只要在檢索編碼數(shù)據(jù)時(shí)使用的名稱與歸檔編碼時(shí)使用的名稱相同,碼時(shí)使用的名稱相同, 就可以指定任何鍵名。唯一可就可以指定任何鍵名。唯一可能出現(xiàn)沖突的情況是,為正在編碼的對(duì)象子類使用了相能出現(xiàn)沖突的情況是,為正在編碼的對(duì)象子類使用了相同的鍵。同的鍵。 為了防止這種情況出現(xiàn),制訂歸檔的鍵時(shí),可為了防止這種情況出現(xiàn),制訂歸檔的鍵時(shí),可將類名放在實(shí)例變量名的前面,代碼淸單將類名放在實(shí)例變量名的前面,代碼淸單19-5就就 是這是這樣做的。樣做的。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 注意,注意,encodeObjectForKe
30、y:方法可以用于任何在其類中實(shí)現(xiàn)方法可以用于任何在其類中實(shí)現(xiàn)對(duì)應(yīng)對(duì)應(yīng)encodeWithCoder:方法的方法的 對(duì)象對(duì)象.v 解碼的過(guò)程剛好相反。傳遞給解碼的過(guò)程剛好相反。傳遞給initWithCoder的參數(shù)也是的參數(shù)也是NSCoder對(duì)象,不必?fù)?dān)心這個(gè)參數(shù),對(duì)象,不必?fù)?dān)心這個(gè)參數(shù), 只要記住它是獲得該消息只要記住它是獲得該消息對(duì)于每個(gè)想要從歸檔文件中提取的對(duì)象的對(duì)象。對(duì)于每個(gè)想要從歸檔文件中提取的對(duì)象的對(duì)象。v 同樣,由于同樣,由于AddressCard類直接繼承自類直接繼承自NSObject,所以不必?fù)?dān),所以不必?fù)?dān)心解碼繼承的實(shí)例變心解碼繼承的實(shí)例變i。假如。假如 的確擔(dān)心,那么應(yīng)在解
31、碼方法的開(kāi)始插的確擔(dān)心,那么應(yīng)在解碼方法的開(kāi)始插人下列行假設(shè)類的超類符合人下列行假設(shè)類的超類符合NSCoding協(xié)議的要求):協(xié)議的要求):v self = super initwithCoder:decoder;v 通過(guò)調(diào)用通過(guò)調(diào)用decodeObjectforKey:方法并傳遞在編碼變量時(shí)使用的方法并傳遞在編碼變量時(shí)使用的相同鍵,就可解碼每個(gè)實(shí)例相同鍵,就可解碼每個(gè)實(shí)例 變量。變量。v 類似于類似于AddressCard類,你為類,你為AddressBook類添加了兩個(gè)編碼類添加了兩個(gè)編碼和解碼方法。在接口文件中只需更改指令,以聲明現(xiàn)在和解碼方法。在接口文件中只需更改指令,以聲明現(xiàn)在Add
32、ressBook類已經(jīng)符合類已經(jīng)符合NSCoding協(xié)議。更改如下所示:協(xié)議。更改如下所示:v interface AddressBook: NSObject 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 下面是實(shí)現(xiàn)文件中所含的方法定義:下面是實(shí)現(xiàn)文件中所含的方法定義:v -(void) encodeWithCoder: (NSCoder *) encoderv v encoder encodeObject: bookName forKey: “AddressBookBookName”;v encoder encodeObject:
33、 book forKey: ”AddressBookBook”;v v -(id) initWithCoder: (NSCoder *) decoderv v bookName = decoder decodeObjectForKey: ”AddressBookBookName” retain;v book = decoder decodeObjectForKey: ”AddressBookBook” retain;v return self;v v 以下代碼清單以下代碼清單19-6是它的測(cè)試程序。是它的測(cè)試程序。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解
34、碼方法編碼方法和解碼方法#import “AddressBook.h”#import int main (int argc, char *argv)NSString *aName = ”Julia Kochan”;NSString *aEmail = ”jewls337axlc”;NSString *bName = ”Tony Iannino”;NSString *bEmail = ”tony.ianninotechfitness”;NSString *cName = ”Stephen Kochan”;NSString *cEmail = ”stevesteve_kochan”;NSStrin
35、g *dName = ”Jamie Baker”;NSString *dEmail = ”jbakerhitmail”;NSAutoreleasePool * pool = NSAutoreleasePool alloc init;AddressCard *card1 = AddressCard alloc init;AddressCard *card2 = AddressCard alloc init;AddressCard *card3 = AddressCard alloc init;AddressCard *card4 = AddressCard alloc init;AddressB
36、ook *myBook = AddressBook alloc;/ First set up four address cardscard1 setName: aName andEmail: aEmail;card2 setName: bName andEmail: bEmail;card3 setName: cName andEmail: cEmail;card4 setName: dName andEmail: dEmail;myBook = myBook initWithName: ”Steves Address Book”;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19
37、.3 編碼方法和解碼方法編碼方法和解碼方法/ Add some cards to the address bookmyBook addCard: card1;myBook addCard: card2;myBook addCard: card3;myBook addCard: card4;myBook sort;if (NSKeyedArchiver archiveRootObject: myBook toFile: ”addrbook.arch” = NO)NSLog (”archiving failed”);card1 release;card2 release;card3 release
38、;card4 release;myBook release;pool drain;return 0; 這個(gè)程序創(chuàng)建了一個(gè)地址簿,然后將它歸檔到文件這個(gè)程序創(chuàng)建了一個(gè)地址簿,然后將它歸檔到文件addrbook.arch中。在創(chuàng)建歸檔文件的過(guò)程中。在創(chuàng)建歸檔文件的過(guò)程中,注意中,注意AddressBook類和類和AddressCard類中的編碼方法都被調(diào)用了。如果想要驗(yàn)證,可以類中的編碼方法都被調(diào)用了。如果想要驗(yàn)證,可以向這些方法添加一些向這些方法添加一些NSLog調(diào)用。調(diào)用。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v代碼淸單代碼淸單
39、19-7展示了如何將歸檔讀人內(nèi)存以根據(jù)文件創(chuàng)建地址簿。展示了如何將歸檔讀人內(nèi)存以根據(jù)文件創(chuàng)建地址簿。v#import “AddressBook.h”v#import vint main (int argc, char *argv)vvAddressBook *myBook;vNSAutoreleasePool * pool = NSAutoreleasePool alloc init;vmyBook = NSKeyedUnarchiver unarchiveObjectWithFile: ”addrbook.arch”;vmyBook list;vpool drain;vreturn 0;vv
40、輸出:輸出:v= Contents of: Steves Address Book =vJamie Baker jbakerhitmailvJulia Kochan jewls337axlcvStephen Kochan stevesteve_kochanvTony Iannino tony.ianninotechfitnessv=武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 在解碼地址簿的過(guò)程中,自動(dòng)調(diào)用向兩個(gè)類添加的解碼方法。注意在解碼地址簿的過(guò)程中,自動(dòng)調(diào)用向兩個(gè)類添加的解碼方法。注意將地址薄讀回程序是多么容易。將地址薄讀回程
41、序是多么容易。v 前面說(shuō)過(guò),前面說(shuō)過(guò),encodeObject:forKey:方法作用子內(nèi)置類以及根據(jù)方法作用子內(nèi)置類以及根據(jù)NSCoding協(xié)議為其編寫編碼協(xié)議為其編寫編碼 和解碼方法的類。如果你的實(shí)例包含和解碼方法的類。如果你的實(shí)例包含基本數(shù)據(jù)類型,如整型或浮點(diǎn)型,那么需要知道如何對(duì)它基本數(shù)據(jù)類型,如整型或浮點(diǎn)型,那么需要知道如何對(duì)它 們進(jìn)行編們進(jìn)行編碼和解碼參見(jiàn)表碼和解碼參見(jiàn)表19-1)。v 下面是一個(gè)類的簡(jiǎn)單定義,這個(gè)類名為下面是一個(gè)類的簡(jiǎn)單定義,這個(gè)類名為Foo,它包含三個(gè)實(shí)例變量,它包含三個(gè)實(shí)例變量:一個(gè)是:一個(gè)是NSString類型類型, 一個(gè)一個(gè)int型,一個(gè)型,一個(gè)float
42、型。這個(gè)類包含一型。這個(gè)類包含一個(gè)賦值方法、三個(gè)取值方法以及兩個(gè)用于歸檔的編碼個(gè)賦值方法、三個(gè)取值方法以及兩個(gè)用于歸檔的編碼/解碼方法:解碼方法:v interface Foo: NSObject v v NSString *strVal;v int intVal;v float floatVal;v v property (copy, nonatomic) NSString *strVal;v property int intVal;v property float floatVal;v end武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解
43、碼方法v實(shí)現(xiàn)文件如下:實(shí)現(xiàn)文件如下:vimplementation Foovsynthesize strVal, intVal, floatVal;v-(void) encodeWithCoder: (NSCoder *) encodervvencoder encodeObject: strVal forKey: ”FoostrVal”;vencoder encodeInt: intVal forKey: ”FoointVal”;vencoder encodeFloat: floatVal forKey: ”FoofloatVal”;vv-(id) initWithCoder: (NSCode
44、r *) decodervvstrVal = decoder decodeObjectForKey: ”FoostrVal” retain;vintVal = decoder decodeIntForKey: ”FoointVal”;vfloatVal = decoder decodeFloatForKey: ”FoofloatVal”;vreturn self;vvend武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v編碼例程首先使用前面用過(guò)的編碼例程首先使用前面用過(guò)的encodeObject:forKey:對(duì)象來(lái)編碼字符串值對(duì)象來(lái)編
45、碼字符串值strVal如上面內(nèi)容所示。如上面內(nèi)容所示。v在代碼淸單在代碼淸單19-8中,我們創(chuàng)建了一個(gè)中,我們創(chuàng)建了一個(gè)Foo對(duì)象對(duì)象,把它歸檔到一個(gè)文件,解歸檔,然后顯示。,把它歸檔到一個(gè)文件,解歸檔,然后顯示。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法#import #import #import #import #import “Foo.h” / Definition for our Foo classint main (int argc, char *argv)NSAutoreleasePool * pool = NSAut
46、oreleasePool alloc init;Foo *myFoo1 = Foo alloc init;Foo *myFoo2;myFoo1 setStrVal: ”This is the string”;myFoo1 setIntVal: 12345;myFoo1 setFloatVal: 98.6;NSKeyedArchiver archiveRootObject: myFoo1 toFile: ”foo.arch”;myFoo2 = NSKeyedUnarchiver unarchiveObjectWithFile: ”foo.arch”;NSLog (”%n%in%g”, myFoo
47、2 strVal, myFoo2 intVal, myFoo2 floatVal);myFoo1 release;pool drain;return 0;輸出:輸出:This is the string1234598.6武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.3 編碼方法和解碼方法編碼方法和解碼方法v 以下消息歸檔了對(duì)象的以下消息歸檔了對(duì)象的3個(gè)實(shí)例變量:個(gè)實(shí)例變量:v encoder encodeObject: strVal forKey: ”FoostrVal”;v encoder encodeInt: intVal forKey: ”FoointVal”;v en
48、coder encodeFloat: floatVal forKey: ”FoofloatVal”;v 一些基本數(shù)據(jù)類型一些基本數(shù)據(jù)類型如如char、short、long和和long long在表在表19-1中沒(méi)有列出。你必須確定數(shù)據(jù)對(duì)象的大中沒(méi)有列出。你必須確定數(shù)據(jù)對(duì)象的大小并使用相應(yīng)的例程小并使用相應(yīng)的例程d例如,例如,short int通常是通常是16位的,位的,而而int和和long可以是可以是32位或位或64位,位,long long是是64位位的可以使用第的可以使用第13章介紹的章介紹的sizeof運(yùn)算符確定任何數(shù)據(jù)運(yùn)算符確定任何數(shù)據(jù)類型的大?。?。所以類型的大小)。所以 要?dú)w檔要?dú)w
49、檔shortint的數(shù)據(jù),首先將其的數(shù)據(jù),首先將其存儲(chǔ)在存儲(chǔ)在int中,然后使用中,然后使用encodelntforKey:歸檔它。歸檔它。反向執(zhí)行該反向執(zhí)行該 過(guò)程可恢復(fù)它:使用過(guò)程可恢復(fù)它:使用decodelntForKey:,然后將其賦值給然后將其賦值給short int變量。變量。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案v有時(shí)可能不想和前面示例程序一樣,使用有時(shí)可能不想和前面示例程序一樣,使用archiveRootObjectToFile:方法將對(duì)象直接方法將對(duì)象直接寫入文件。比如,可能想收集一些或僉部對(duì)象,寫
50、入文件。比如,可能想收集一些或僉部對(duì)象,并將其存儲(chǔ)到單個(gè)檔案文件中。在并將其存儲(chǔ)到單個(gè)檔案文件中。在Objective-C中,通過(guò)使中,通過(guò)使 用名為用名為NSData的通用數(shù)據(jù)流對(duì)象的通用數(shù)據(jù)流對(duì)象類,可以實(shí)現(xiàn)上述功能,在第類,可以實(shí)現(xiàn)上述功能,在第16章,我們簡(jiǎn)單章,我們簡(jiǎn)單地提到過(guò)這個(gè)類。地提到過(guò)這個(gè)類。 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案v正如第正如第16章所提到的,章所提到的,NSData對(duì)象可以用來(lái)對(duì)象可以用來(lái)保留一塊內(nèi)存空間以備后來(lái)存儲(chǔ)敉據(jù)。這些數(shù)保留一塊內(nèi)存空間以備后來(lái)存儲(chǔ)敉據(jù)。這些數(shù) 據(jù)空間的典
51、型應(yīng)用是怍為一些數(shù)據(jù)的臨時(shí)存儲(chǔ)空據(jù)空間的典型應(yīng)用是怍為一些數(shù)據(jù)的臨時(shí)存儲(chǔ)空間,如隨后將被寫人文件,或可能用于容納從間,如隨后將被寫人文件,或可能用于容納從 磁盤讀取的文件內(nèi)容。創(chuàng)建可變數(shù)據(jù)空間的最簡(jiǎn)磁盤讀取的文件內(nèi)容。創(chuàng)建可變數(shù)據(jù)空間的最簡(jiǎn)單方式是使用單方式是使用data方法方法武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案 dataArea = NSMutabletata date;該語(yǔ)句創(chuàng)建一個(gè)空緩沖區(qū),其大小隨程序執(zhí)行需要該語(yǔ)句創(chuàng)建一個(gè)空緩沖區(qū),其大小隨程序執(zhí)行需要而擴(kuò)展。而擴(kuò)展。作為一個(gè)簡(jiǎn)單的例子,假設(shè)你想將地址簿和
52、一個(gè)作為一個(gè)簡(jiǎn)單的例子,假設(shè)你想將地址簿和一個(gè)Foo對(duì)象歸檔到同一個(gè)文件。假設(shè)對(duì)于這個(gè)對(duì)象歸檔到同一個(gè)文件。假設(shè)對(duì)于這個(gè) 例例子,你已經(jīng)向子,你已經(jīng)向AddressBook和和AddressCard類添加了一個(gè)帶鍵的歸檔方法類添加了一個(gè)帶鍵的歸檔方法參見(jiàn)如下代碼參見(jiàn)如下代碼武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案#import #import #import #import #import #import #import “AddressBook.h”#import “Foo.h”int main (int argc,
53、 char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;Foo *myFoo1 = Foo alloc init;Foo *myFoo2;NSMutableData *dataArea;NSKeyedArchiver *archiver;AddressBook *myBook;/ Insert code from Program 19.7 to create an Address Book/ in myBook containing four address cards武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2
54、.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案#import #import #import #import #import #import #import “AddressBook.h”#import “Foo.h”int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;Foo *myFoo1 = Foo alloc init;Foo *myFoo2;NSMutableData *dataArea;NSKeyedArchiver *archiver;A
55、ddressBook *myBook;/ Insert code from Program 19.7 to create an Address Book/ in myBook containing four address cards武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用使用NSData創(chuàng)建自定義檔案創(chuàng)建自定義檔案myFoo1 setStrVal: ”This is the string”;myFoo1 setIntVal: 12345;myFoo1 setFloatVal: 98.6;/ Set up a data area and connect it t
56、o an NSKeyedArchiver objectdataArea = NSMutableData data;archiver = NSKeyedArchiver allocinitForWritingWithMutableData: dataArea;/ Now we can begin to archive objectsarchiver encodeObject: myBook forKey: ”myaddrbook”;archiver encodeObject: myFoo1 forKey: ”myfoo1”;archiver finishEncoding;/ Write the
57、archived data are to a fileif ( dataArea writeToFile: ”myArchive” atomically: YES = NO)NSLog (”Archiving failed!”);archiver release;myFoo1 release;pool drain;return 0;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用歸檔程序復(fù)制對(duì)象使用歸檔程序復(fù)制對(duì)象v 分配一個(gè)分配一個(gè)NSKeyedArchiver對(duì)象之后,發(fā)送對(duì)象之后,發(fā)送initForWritingWithMutableData:消息,以指定要消息,
58、以指定要 寫入歸檔寫入歸檔數(shù)據(jù)的存儲(chǔ)空間。這就是前面創(chuàng)建的數(shù)據(jù)的存儲(chǔ)空間。這就是前面創(chuàng)建的NSMutabledata空間空間dataArea。此時(shí),就可以向存儲(chǔ)在。此時(shí),就可以向存儲(chǔ)在archives中的中的NSKeyedArchiver對(duì)象發(fā)送編碼消息,以歸檔該程序中的對(duì)象對(duì)象發(fā)送編碼消息,以歸檔該程序中的對(duì)象.實(shí)際上,所有實(shí)際上,所有 編碼消息在收到編碼消息在收到finishEncoding消息之前都被歸檔消息之前都被歸檔并存儲(chǔ)在指定的數(shù)據(jù)空間內(nèi)并存儲(chǔ)在指定的數(shù)據(jù)空間內(nèi).v 這里,有兩個(gè)對(duì)象需要編碼這里,有兩個(gè)對(duì)象需要編碼-個(gè)是地址簿,另一個(gè)是個(gè)是地址簿,另一個(gè)是Foo對(duì)象,對(duì)對(duì)象,對(duì)干這
59、些對(duì)象可以使干這些對(duì)象可以使v 用用encodeObject:forKey:,因?yàn)樵谇懊婺阋呀?jīng)為,因?yàn)樵谇懊婺阋呀?jīng)為AddressBook、AddressCard和和Foo類實(shí)現(xiàn)了編碼方法和解碼類實(shí)現(xiàn)了編碼方法和解碼方法理解這個(gè)概念很重要)方法理解這個(gè)概念很重要)v 在歸檔這兩個(gè)對(duì)象時(shí),向在歸檔這兩個(gè)對(duì)象時(shí),向archiver對(duì)象發(fā)送一條對(duì)象發(fā)送一條finishEncoding消息。之后,就不能編碼其他對(duì)象,你需要發(fā)送此消息以完成歸檔消息。之后,就不能編碼其他對(duì)象,你需要發(fā)送此消息以完成歸檔過(guò)程。過(guò)程。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)19.4 使用歸檔程序復(fù)制對(duì)象使用
60、歸檔程序復(fù)制對(duì)象v 此時(shí),你預(yù)留的那塊名為此時(shí),你預(yù)留的那塊名為dataArea的空間包含歸檔對(duì)象,這些對(duì)的空間包含歸檔對(duì)象,這些對(duì)象可以一種可寫入文件的格式存在。消息表達(dá)式象可以一種可寫入文件的格式存在。消息表達(dá)式v data writeToFile: ”myArchive” atomically: YESv 向你的數(shù)據(jù)流發(fā)送向你的數(shù)據(jù)流發(fā)送writeToFile:atomically:消息,請(qǐng)求它把消息,請(qǐng)求它把它的數(shù)據(jù)寫人指定文件,它的數(shù)據(jù)寫人指定文件, 這個(gè)文件名為這個(gè)文件名為myArchive。v 從從if語(yǔ)句可以看到語(yǔ)句可以看到writeToFile:atomically:方法返回
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文件和資料的控制措施
- 2019-2020學(xué)年高中數(shù)學(xué)第2章解析幾何初步2-1-5平面直角坐標(biāo)系中的距離公式課件北師大版必修2
- 二零二五年環(huán)保項(xiàng)目違約責(zé)任承擔(dān)合同規(guī)定3篇
- 高考專題復(fù)習(xí)探究走向全球化中的國(guó)際關(guān)系歷程課件教學(xué)講義
- 2024年浙江建設(shè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 二零二五年機(jī)器人技術(shù)授權(quán)及合作開(kāi)發(fā)合同3篇
- 2024年隴西縣中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年阜陽(yáng)市第三人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 二零二五年度股份合作企業(yè)四股東合作協(xié)議3篇
- 2024年沈陽(yáng)航空職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 2025年度愛(ài)讀書學(xué)長(zhǎng)主辦的讀書挑戰(zhàn)賽組織合同
- 2024年滄州經(jīng)濟(jì)開(kāi)發(fā)區(qū)招聘社區(qū)工作者筆試真題
- 2025年安徽省銅陵市公安局交警支隊(duì)招聘交通輔警14人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 公共政策分析 課件 第8章政策評(píng)估;第9章政策監(jiān)控
- 人教版八年級(jí)上學(xué)期物理期末復(fù)習(xí)(壓軸60題40大考點(diǎn))
- 企業(yè)環(huán)保知識(shí)培訓(xùn)課件
- 2024年度管理評(píng)審報(bào)告
- 暨南大學(xué)《微觀經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)藥銷售合規(guī)培訓(xùn)
- DB51-T 5038-2018 四川省地面工程施工工藝標(biāo)準(zhǔn)
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
評(píng)論
0/150
提交評(píng)論