ObjectiveC20程序設(shè)計(jì)第19章歸檔ppt課件_第1頁(yè)
ObjectiveC20程序設(shè)計(jì)第19章歸檔ppt課件_第2頁(yè)
ObjectiveC20程序設(shè)計(jì)第19章歸檔ppt課件_第3頁(yè)
ObjectiveC20程序設(shè)計(jì)第19章歸檔ppt課件_第4頁(yè)
ObjectiveC20程序設(shè)計(jì)第19章歸檔ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論