1. Cocoa如何應用設計模式求解答
Cocoa經常把自己與眾不同的工作機制建立在模式上,它的設計受到諸如語言能力或現有架構這樣因素的影響。 本部分包含設計模式:可重用的面向對象軟體的元素一書中編目的大多數設計模式的介紹。每個設計模式都有一個總結性的描述,以及該模式的Cocoa實現的討論。文中列出的都是Cocoa實現的模式,每個模式的討論都發生在特定的Cocoa環境中。我們推薦您熟悉這些模式,您會發現這些模式在Cocoa軟體開發中非常有用。 Cocoa中設計模式的實現有不同的形式。下面部分中描述的一些設計—比如協議和范疇—是Objective-C語言的特性;在另外一些場合中,「模式的實例」被實現為一個類或一組相關的類(比如類簇和單件類);還有一些場合下,模式表現為一個大的框架結構,比如響應者鏈模式。對於某些基於模式的機制,您幾乎可以「免費」使用;而另外一些機制則要求您做一些工作。即使對於Cocoa沒有實現的模式,我們也鼓勵您在條件許可的情況下自行實現,比如在擴展類的行為時,對象合成(裝飾模式)技術通常就比生成子類更好。 有兩個設計模式沒有在下面的內容中進行討論,即模型-視圖-控制器(MVC)模式和對象建模。MVC是一種復合或聚合模式,就是說它基於幾種不同類型的模式。對象建模在四人組的分類目錄中沒有對應類別,它源自關系資料庫領域。然而,MVC和對象建模在Cocoa中可能是最重要和最普遍的設計模式或用語,而且它們在很大程度上是相關的。它們在幾個技術的設計中發揮關鍵的作用,包括綁定、撤消管理、腳本控制、和文檔架構。要了解更多有關這些模式的信息,請參見"模型-視圖-控制器設計模式"和"對象建模"部分。 本部分包含如下主要內容:抽象工廠模式適配器模式責任鏈模式命令模式合成模式裝飾模式表觀模式跌代器模式仲裁者模式備忘錄模式觀察者模式代理模式單件模式模板方法模式 抽象工廠模式提供一個介面,用於創建與某些對象相關或依賴於某些對象的類家族,而又不需要指定它們的具體類。通過這種模式可以去除客戶代碼和來自工廠的具體對象細節之間的耦合關系。 類簇類簇是一種把一個公共的抽象超類下的一些私有的具體子類組合在一起的架構。抽象超類負責聲明創建私有子類實例的方法,會根據被調用方法的不同分配恰當的具體子類,每個返回的對象都可能屬於不同的私有子類。 Cocoa將類簇限制在數據存儲可能因環境而變的對象生成上。Foundation框架為NSString、NSData、NSDictionary、NSSet、和NSArray對象定義了類簇。公共超類包括上述的不可變類和與其相互補充的可變類NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet、和NSMutableArray。 使用和限制 當您希望創建類簇代表的類型的可變或不可變對象時,可以使用類簇中的某個公共類來實現。使用類簇是在簡潔性和擴展性之間進行折衷。類簇可以簡化類介面,因此使其更易於學習和使用,但是創建類簇抽象類的定製子類則會變得更加困難。進一步閱讀: "類簇" 部分提供有關Cocoa類簇的更多信息。 適配器模式將一個類介面轉化為客戶代碼需要的另一個介面。適配器使原本由於兼容性而不能協同工作的類可以工作在一起,消除了客戶代碼和目標對象的類之間的耦合性。 協議協議是一個編程語言級別(Objective-C)的特性,它使定義適配器模式的實例成為可能(在 java中的「介面」和「協議」是同義的)。如果您希望一個客戶對象和另一個對象進行交流,但由於它們的介面不兼容而導致困難,您就可以定義一個協議,它本質上是一系列和類不相關聯的方法聲明。這樣,其它對象的類就可以正式採納該協議,並通過實現協議中的全部方法來「遵循」該協議。結果,客戶對象就可以通過協議介面向其它對象發送消息。 協議是一組獨立於類層次的方法聲明,這樣就有可能象類的繼承那樣,根據對象遵循的協議對其進行分組。您可以通過NSObject的conformsToProtocol:方法來確認一個對象的協議關系。 除了正式協議之外,Cocoa還有一個非正式協議的概念。這種類型的協議是NSObject類中的一個范疇(category),這樣就使所有的對象都成為范疇方法的潛在實現者(參見"范疇"部分)。非正式協議的方法可以選擇性地實現。非正式協議是委託機制實現的一部分(參見"委託"部分。 請注意,協議的設計和適配器模式並不完全匹配。但它是使介面不兼容的類在得以協同工作的手段。 使用和限制 協議主要用於聲明層次結構上不相關的類為了互相通訊而需要遵循的介面。但是,您也可以將協議用於聲明對象的介面,而隱藏相應的類。Cocoa框架包括很多正式協議,這些協議使定製子類可以和框架進行特定目的的通訊。舉例來說,Foundation框架中包含NSObject、NSCopying、和NSCoding協議,都非常重要。Application Kit中的協議包括NSDraggingInfo、NSTextInput、和NSChangeSpelling。 正式協議要求遵循者實現協議聲明的所有方法。它們也是零碎的,一旦您定義一個協議並將它提供給其它類,將來對協議的修改會使那些類不能工作。進一步閱讀:有關正式協議的更多信息請參見Objective-C編程語言文檔中「擴展類」部分的討論。 責任鏈模式通過為多個對象提供處理請求的機會,避免請求的發送者和接收者產生耦合。將接收對象串成鏈,並將請求沿著接收者鏈進行傳遞,直到某個對象對其進行處理。對象或者處理該請求,或者將它傳遞給鏈中的下一個對象。 響應者鏈Application Kit框架中包含一個稱為響應者鏈的架構。該鏈由一系列響應者對象(就是從NSResponder繼承下來的對象)組成,事件(比如滑鼠點擊)或者動作消息沿著鏈進行傳遞並(通常情況下)最終被處理。如果給定的響應者對象不處理特定的消息,就將消息傳遞給鏈中的下一個響應者。響應者在鏈中的順序通常由視圖的層次結構來決定,從層次較低的響應者對象向層次較高的對象傳遞,頂點是管理視圖層次結構的窗口對象,窗口對象的委託對象,或者全局的應用程序對象。事件和動作消息在響應者鏈中的確切傳遞路徑是不盡相同的。一個應用程序擁有的響應者鏈可能和它擁有的窗口(甚至是局部層次結構中的視圖對象)一樣多,但每次只能有一個響應者鏈是活動的—也就是與當前活動窗口相關聯的那個響應鏈。 還有一個與響應者鏈相類似的鏈,用於應用程序的錯誤處理。 視圖層次的設計應用的是合成模式(參見"合成模式"部分),它和響應者鏈密切相關。動作消息—源自控制項對象的消息—基於目標-動作機制,是命令模式(參見"命令模式"部分)的一個實例。 使用和限制 當您通過Interface Builder或以編程的方式為程序構造用戶界面時,可以「免費」得到一個或多個響應者鏈。響應者鏈和視圖層次結構一起出現,當您使一個視圖對象成為窗口內容視圖的子視圖時,視圖層次結構就自動生成了。如果您將一個定製視圖加入到一個視圖層次結構中,它就變成響應者鏈的一部分;如果您實現了恰當的NSResponder方法,就可以接收和處理事件及動作消息。定製對象是窗口對象或全局應用程序對象NSApp的委託對象,也可以接收和處理那些消息。 您也可以用編程的方式將定製的響應者對象注入到響應者鏈中,以及通過編程操作響應者在鏈中的順序。進一步閱讀: 處理事件和動作消息及程序錯誤的的響應者鏈在Cocoa事件處理指南和Cocoa的錯誤處理編程指南文檔中進行描述。本文檔在"合成模式"部分對視圖層次結構有總結性的介紹,在"核心應用程序架構"部分有更全面的描述。 命令模式這種模式將請求封裝為對象,使您可以用不同的請求來對客戶代碼進行參數化;對請求進行排隊和記錄,並支持可撤消(undoable)的操作。請求對象將一或多個動作綁定在特定的接收者上。命令模式將發出請求的對象和接收及執行請求的對象區分開來。 調用對象NSInvocation類的實例用於封裝Objective-C消息。一個調用對象中含有一個目標對象、一個方法選擇器、以及方法參數。您可以動態地改變調用對象中消息的目標及其參數,一旦消息被執行,您就可以從該對象得到返回值。通過一個調用對象可以多次調用目標或參數不同的消息。 創建NSInvocation對象需要使用NSMethodSignature對象,該對象負責封裝與方法參數和返回值有關系的信息。NSMethodSignature對象的創建又需要用到一個方法選擇器。NSInvocation的實現還用到Objective-C運行環境的一些函數。 使用和限制NSInvocation對象是分布式、撤消管理、消息傳遞、和定時器對象編程介面的一部分。在需要去除消息發送對象和接收對象之間的耦合關系的類似場合下,您也可以使用。 分布式對象是一種進程間通訊技術,關於這個主題的更多信息請參見"代理模式"部分。進一步閱讀:調用對象的細節請閱讀NSInvocation的類參考文檔。您也可以從下面的文檔中獲取相關技術的信息:Objective-C編程語言文檔中的分布式對象、撤消架構、定時器以及之後的部分。 目標-動作目標-動作機制使控制項對象—也就是象按鍵或文本輸入框這樣的對象—可以將消息發送給另一個可以對消息進行解釋並將它處理為具體應用程序指令的對象。接收對象,或者說是目標,通常是一個定製的控制器對象。消息—也被稱為動作消息—由一個選擇器來確定,選擇器是一個方法的唯一運行時標識。典型情況下,控制項擁有的單元對象會對目標和動作進行封裝,以便在用戶點擊或激活控制項時發送消息(菜單項也封裝了目標和動作,以便在用戶選擇時發送動作消息)。目標-動作機制之所以能夠基於選擇器(而不是方法簽名),是因為Cocoa規定動作方法的簽名和選擇器名稱總是一樣的。 使用和限制 當您用Interface Builder構建程序的用戶界面時,可以對控制項的動作和目標進行設置。您因此可以讓控制項具有定製的行為,而又不必為控制項本身書寫任何的代碼。動作選擇器和目標連接被歸檔在nib文件中,並在nib文件被解檔時復活。您也可以通過向控制項或它的單元對象發送setTarget:和setAction:消息來動態地改變目標和動作。 目標-動作機制經常用於通知定製控制器對象將數據從用戶界面傳遞給模型對象,或者將模型對象的數據顯示出來。Cocoa綁定技術則可以避免這種用法,有關這種技術的更多信息請參見Cocoa綁定編程主題文檔。 Application Kit中的控制項和單元並不保持它們的目標。相反,它們維護一個對目標的弱引用。進一步的信息請參見"委託、觀察者、和目標的所有權" 部分。進一步閱讀:更多信息請參見"目標-動作機制"部分。 合成模式這種模式將互相關聯的對象合成為樹結構,以表現部分-全部的層次結構。它使客戶代碼可以統一地處理單獨的對象和多個對象的合成結果。 合成對象是模型-視圖-控制器聚集模式的一部分。 視圖層次結構 一個窗口包含的視圖對象(NSView對象)在內部構成了一個視圖層次結構。層次結構的根是窗口對象(NSWindow對象)和它的內容視圖。內容視圖就是填充到窗口內容方框中的透明視圖,添加到內容視圖中的視圖都是它的子視圖,而這些子視圖又會成為下一級視圖的父視圖。一個視圖有一個(且只有一個)父視圖,可以有零或多個子視圖。在視覺上,您可以將這個結構理解為包含關系:父視圖包含它的子視圖。圖4-2顯示視圖層次的結構以及在視覺上的關系。 圖4-2 視圖層次的結構及其在視覺上的關系 視圖層次是一個結構方面的架構,在圖形描畫和事件處理上都扮演一定的角色。一個視圖有兩個影響圖形操作位置的邊界框,即邊框(frame)和邊界(bound)。邊框是外部邊界,表示視圖在其父視圖坐標系統中的位置,它負責定義視圖的尺寸,並根據視圖邊界對圖形進行裁減。邊界則是內部的邊界框,負責定義視圖對象自身描畫表面的內部坐標系統。 當窗口系統要求一個窗口做好顯示准備時,父視圖會在其子視圖之前被要求進行渲染。當您向一個視圖發送消息時—比如發送一個重畫視圖的消息—該消息就會被傳播到子視圖。因此,您可以將視圖層次結構中的一個分支當成一個統一的視圖來處理。 響應者鏈也把視圖層次用於處理事件和動作消息。請參見責任鏈模式部分中("責任鏈模式")關於響應者鏈的總結描述。 使用和限制 無論以編程的方式,還是通過Interface Builder,當您將一個視圖加入到另一個視圖中時,都需要創建或修改視圖層次結構。Application Kit框架自動處理與視圖層次結構相關聯的所有關系。進一步閱讀:如果需要了解更多視圖層次結構的信息,請閱讀本文檔的"視圖層次結構"部分。Cocoa描畫指南文檔中也對視圖層次結構進行討論。 裝飾模式這種模式動態地將額外的責任附加到一個對象上。在進行功能擴展時,裝飾是子類化之外的一種靈活的備選方法。和子類化一樣,採納裝飾模式可以加入新的行為,而又不必修改已有的代碼。裝飾將需要擴展的類的對象進行包裝,實現與該對象相同的介面,並在將任務傳遞給被包裝對象之前或之後加入自己的行為。裝飾模式表達了這樣的設計原則:類應該接納擴展,但避免修改。 一般性的說明 裝飾是用於對象合成的模式。在您自己的代碼中應該鼓勵使用對象的合成(參見"什麼時候需要生成子類"部分)。然而,Cocoa自己提供了一些基於這種模式的類和機制(在下面的部分進行討論)。在這些實現中,擴展對象並不完全復制它所包裝的對象的介面,雖然具體實現中可以使用不同的技術來進行介面共享。 Cocoa在實現某些類時用到了裝飾模式,包括NSAttributedString、NSScrollView、和NSTableView。後面兩個類是復合視圖的例子,它們將其它一些視圖類的對象組合在一起,然後協調它們之間的交互。 委託委託是在宿主對象中嵌入一個指向另一對象(也就是委託對象)的弱引用(一個未保持的插座變數),並不時地向該委託對象發送消息,使其對有關的任務進行輸入的機制。宿主對象一般是一個「復活」的框架對象(比如一個NSWindow或NSXMLParser對象),它尋求完成某項工作,但又只能以一般的方式來進行。委託幾乎總是一個定製類的實例,它負責配合宿主對象,在有關任務的特定點(參見圖4-3)上提供與具體程序有關的行為。這樣,委託機制使我們可以對另一個對象的行為進行修改或者擴展,而不需要生成子類。 圖4-3 框架對象向它的委託對象發送消息 簡而言之,委託就是一個對象將任務委託給另一個對象,它是面向對象編程的常用技術。然而,Cocoa以獨特的方式實現委託機制。宿主類用非正式協議—即NSObject中的范疇—來定義委託對象可能選擇實現的介面。委託對象不必象採納正式協議那樣實現所有的協議方法。在向委託對象發送消息之前,宿主對象可以首先確定相應的方法是否實現(通過respondsToSelector:消息),以避免運行時例外。有關正式協議和非正式協議的更多信息,請參見"協議"部分。 Cocoa框架中的一些類也向它們的數據源發送消息。數據源在各個方面都和委託一樣,除了它的目的是為宿主對象提供數據,以傳遞給瀏覽器、表視圖、或者類似的用戶界面視圖。和委託不同的是,數據源還必須實現某些協議方法。 委託不是裝飾模式的嚴格實現。宿主(委託)對象並沒有包裝它希望擴展的類的實例。相反,委託是對委託框架類的行為進行特殊化。除了框架類聲明的委託方法之外,它們也沒有公共的介面。 Cocoa中的委託也是模板方法模式("模板方法模式")的一部分。 使用和限制 委託是Cocoa框架中的一種常用的設計。Application Kit框架中的很多類都向它們的委託發送消息,包括NSApplication、NSWindow、和NSView的幾個子類。Foundation框架中的一些類,比如NSXMLParser和NSStream,也維護自己的委託。您應該總是使用類的委託機制,而不是生成類的子類,除非委託方法不能完成您的目標。 雖然您可以動態地改變委託,但是同時只能有一個對象可以成為委託。因此,如果您希望當特定的程序事件發生時,有多個對象可以同時得到通知,則不能使用委託。在這種情況下您可以使用通告機制。如果委託對象實現了一或多個框架類聲明的通告方法,就會自動接收到其委託框架對象的通告。請參考觀察者模式( "觀察者模式")中有關通告的討論。 Application Kit框架中的向外委託任務的對象並不保持它們的委託或數據源,而是維護一個弱引用,更多信息請參見"委託、觀察者、和目標的所有權"部分。進一步閱讀:關於委託的進一步信息請參見"委託和數據源"部分。 范疇范疇是Objective-C語言的一個特性,用於為一個類增加方法(介面和實現),而不必生成子類。類原始聲明的方法和通過范疇添加的方法在運行時沒有區別—在您的程序的作用范圍內。范疇中的方法成為類類型的一部分,並被所有的子類繼承。 和委託一樣,范疇並沒有嚴格適配裝飾模式。它實現了該模式的目的,但採用不同的實現方式。范疇加入的行為是在編譯時生成的,而不是動態得到的。而且,范疇並沒有封裝被擴展的類的實例。 使用和限制 Cocoa框架中定義了很多范疇,大多數都是非正式協議(在"協議"部分中進行總結)。它們通常使用范疇來對相關的方法進行分組。您也可以在代碼中實現范疇,以在不生成子類的情況下對類進行擴展,或者對相關的方法進行分組。但是您需要注意如下兩點: 您不能為類添加實例變數。 如果您對現有的方法進行重載,則應用程序可能產生預料之外的行為。進一步閱讀: 更多有關范疇的信息請參見Objective-C編程語言一文中的「類的擴展」部分。 表觀模式這種模式為子系統中的一組介面提供統一的介面。表觀模式定義一個更高級別的介面,通過減少復雜度和隱藏子系統之間的通訊和依賴性,使子系統更加易於使用。 NSImageNSImage類為裝載和使用基於點陣圖(比如JPEG、PNG、或者TIFF格式)或向量(EPS或pdf格式)的圖像提供統一的介面。NSImage可以為同一個圖像保持多個表示,不同的表示對應於不同類型的NSImageRep對象。NSImage可以自動選擇適合於特定數據類型和顯示設備的表示。同時,它隱藏了圖像操作和選擇的細節,使客戶代碼可以交替使用很多不同的表示。 使用和限制 由於NSImage支持幾種不同的圖像表示,因此某些屬性可能不能適用。舉例來說,您可能不能取得圖像中一個像素的顏色,如果潛在的圖像表示使基於向量且與設備無關的話。請注意:NSImage和圖像表示的討論請參見Cocoa描畫指南。 迭代器模式這種模式提供一種順序訪問聚合對象(也就是一個集合)中的元素,而又不必暴露潛在表示的方法。迭代器模式將訪問和遍歷集合元素的責任從集合對象轉移到迭代器對象。迭代器定義一個訪問集合元素的介面,並對當前元素進行跟蹤。不同的迭代器可以執行不同的遍歷策略。 NSEnumerator Foundation框架中的NSEnumerator類實現了迭代器模式。NSEnumerator抽象類的私有具體子類返回的枚舉器對象可以順序遍歷不同類型的集合—數組、集合、字典(值和鍵)—並將集合中的對象返回給客戶代碼。NSDirectoryEnumerator是一個不緊密相關的類,它的實例可以遞歸地枚舉文件系統中目錄的內容。 使用和限制 象NSArray、NSSet、和NSDictionary這樣的集合類都包含相應的方法,可以返回與集合的類型相適用的枚舉器。所有的枚舉器的工作方式都一樣。您可以在循環中向枚舉器發送nextObject消息,如果該消息返回nil,而不是集合中的下一個對象,則退出循環。 仲裁者模式這種模式定義的對象用於封裝一組對象的交互機制。仲裁者模式可以避免對象之間顯式的互相引用,使對象之間的耦合變得寬松,也使您可以獨立地改變它們的交互方式。這些對象也因此可以更具重用性。 仲裁者對象集中了系統中的對象之間的復雜通訊和控制邏輯。這些對象在狀態發生改變時會告訴仲裁者對象,反過來,也對仲裁者對象的請求進行響應。 控制器類模型-視圖-控制器設計模式為一個面向對象的系統(比如一個應用程序)中的對象分配不同的角色。它們可以是模型對象,包含應用程序的數據及對那些數據進行操作;可以是視圖對象,負責表示數據及響應用戶動作;也可以是控制器對象,負責協調模型和視圖對象。控制器對象適合於仲裁者模式。 在Cocoa中,控制器對象一般有兩個類型:仲裁控制器或者協調控制器。仲裁控制器負責仲裁應用程序中視圖對象和模型對象之間的數據流。仲裁控制器通常是NSController對象。協調控制器則負責實現應用程序的集中化通訊和控制邏輯,作為框架對象的委託和動作消息的目標。它們通常是NSWindowController對象或定製NSObject子類的實例。由於協調控制器高度專用於特定的程序,因此不考慮重用。 Application Kit框架中的NSController抽象類和它的具體子類是Cocoa綁定技術的一部分,該技術可以自動同步模型對象包含的數據和視圖對象中顯示及編輯的數據。舉例來說,如果用戶在一個文本框中編輯一個字元串,綁定技術會將文本框中的變化(通過仲裁控制器)傳遞給綁定了的模型對象中合適的屬性。編程者需要做的就是正確設計自己的模型對象,並通過Interface Builder在程序的視圖、控制器、和模型對象之間建立綁定關系。 具體的公共控制器類的實例可以在Interface Builder的控制項選盤上得到,因此是高度可重用的。它們提供一些服務,比如選擇和佔位符值的管理。這些對象執行下面這些特定的功能:NSObjectController 管理一個單獨的模型對象。NSArrayController 管理一個模型對象數組,以及維護一個選擇;還可以在數組中加入或刪除模型對象。NSTreeController 使您可以在一個具有層次的樹結構中添加、刪除、和管理模型對象。NSUserDefaultsController 為預置(用戶預設值)系統提供一個便利的介面。 使用和限制 您通常可用將NSController對象用作仲裁控制器,因為這些對象的設計目的是在應用程序的視圖對象和模型對象之間傳遞數據。在使用仲裁控制器時,您通常是從Interface Builder選盤中拖出對象,指定模型對象的屬性鍵,並通過Interface Builder Info 窗口中的Bindings面板建立視圖和模型對象之間的綁定關系。您也可以生成NSController或其子類的子類,以獲得更具具體行為的子類。 幾乎任何一對對象之間都可以建立綁定關系,只要它們遵循NSKeyValueCoding和NSKeyValueObserving這兩個非正式協議。但是,我們推薦您通過仲裁控制器來建立綁定,以得到NSController及其子類為您提供的各種好處。 協調控制器通過下面的方式集中實現一個應用程序的通訊和控制邏輯: 維護指向模型和視圖對象的插座變數(插座變數是指向其它被保持為實例變數的連接或引用)。 通過目標-動作機制響應用戶在視圖對象上的操作(參見"目標-動作"部分)。 作為委託對象,處理從框架對象發出的消息(參見"委託"部分)。 您通常可以在Interface Builder中建立上述的連接—插座變數、目標-動作、和委託,它將這些連接歸檔到應用程序的nib文件中。進一步閱讀: 有關仲裁控制器、協調控制器、和與控制器有關的設計決定的討論,請參見"模型-視圖-控制器設計模式"部分。 備忘錄模式這種模式在不破壞封裝的情況下,捕捉和外部化對象的內部狀態,使對象在之後可以回復到該狀態。備忘錄模式使關鍵對象的重要狀態外部化,同時保持對象的內聚性。 歸檔歸檔將一個程序中的對象以及對象的屬性(包括屬性和關系)存儲到檔案上,使之可以保存到文件系統中,或者在不同的處理器和網路間傳遞。檔案將程序的對象圖保存為獨立於架構的位元組流,對象的標識和對象之間的關系都會被保留。由於對象的類型和它的數據一起被存儲,從歸檔的位元組流解碼出來的對象會被正常實例化,實例化所用的類與原來編碼的類相同。 使用和限制 通常情況下,您希望將程序中需要保存狀態的對象歸檔。模型對象幾乎總是屬於這個范疇。您通過編碼將對象寫入到檔案中,而通過解碼將對象從檔案中讀取出來。通過NSCoder對象可以執行編解碼操作,在編解碼過程中最好使用鍵化的歸檔技術(需要調用NSKeyedArchiver和NSKeyedUnarchiver類的方法)。被編解碼的對象必須遵循NSCoding協議;該協議的方法在歸檔過程中會被調用。進一步閱讀: 有關歸檔的進一步信息。 屬性列表的序列化屬性列表是一個簡單的、具有一定結構的對象圖序列,它僅使用下面這些類的對象:NSDictionary、NSArray、NSString、NSData、NSDate、和NSNumber。這些對象通常也被稱為屬性列表對象。Cocoa中有幾個框架類提供了序列化屬性列表對象,以及定義錄寫對象內容及其層次關系的特殊數據流格式的方法。NSPropertyListSerialization類就提供了將屬性列表對象序列化為XML或其它優化的二進制格式的類方法。 使用和限制 如果對象圖中包含的是簡單對象,則在捕捉和外部化對象及其狀態時,屬性列表序列化是一種靈活的、可移植的、而又非常適當的工具。然而,這種形式的序列化有它的限制,它不保留對象的全部類標識,而只保留一些一般的類型(數組、字典、字元串、等等)。這樣,從屬性列表恢復出來的對象可能和原來的類不同,特別是當對象的可變性可能發生變化時,這就會帶來問題。屬性列表序列化也不跟蹤在同一對象中被多次引用的對象,這可能導致反向序列化時產生多個實例,而在原來的對象圖中卻只有一個實例。進一步閱讀: 有關屬性列表序列化的更多信息。 Core DataCore Data是一個管理對象圖,並使其留存的框架和架構。正是第二種能力—對象的留存能力—使Core Data成為備忘錄模式的一種適配形式。 在Core Data架構中,中心的對象稱為被管理對象上下文,負責管理應用程序對象圖中的模型對象。在被管理對象上下文下面是該對象圖的持久棧,也就是一個框架對象的集合,負責協調模型對象和外部數據存儲,比如XML文件或關系資料庫。持久棧對象負責建立存儲中的數據和被管理對象上下文中的對象之間的映射關系,在
2. cocoa和foundation框架的區別
Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的編程環境,是Mac OS X上五大API之一(其它四個是Carbon、POSIX、X11和Java)。
Cocoa 應用程序一般在蘋果公司的開發工具Xcode(前身為Project Builder)和Interface Builder上用 Objective-C寫成。不過,通過Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等橋接技術,Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者語言也可以用來開發 Cocoa 應用。也有一些其它語言的Cocoa實現無須橋接,比如蘋果公司開發的MacRuby和類似Lisp的Nu語言。不使用Xcode和Interface Builder,僅僅通過文本編輯器、GCC和GNU make工具也可以用Objective-C語言開發Cocoa應用。
對最終用戶來說,使用Cocoa編程環境開發的應用程序即為Cocoa 應用。這類應用有獨特的外觀,因為Cocoa編程環境讓程序在多方面自動遵循蘋果公司的人機界面守則。
Cocoa包含兩個主要的Objective-C對象庫,稱為「框架」。框架的功能類似於動態庫,即可以在運行時動態的載入應用程序的地址空間,但框架作為一個捆綁 (計算機)而非獨立文件,其中除了可執行代碼外,也包含了資源,頭文件和文檔。
「Foundation 工具包」,或簡稱為「Foundation」,首先出現在OpenStep中。在Mac OS X中,它是基於Core Foundation的。作為通用的面向對象的函數庫,Foundation提供了字元串,數值的管理,容器及其枚舉,分布式計算,事件循環,以及一些其它的與圖形用戶界面沒有直接關系的功能。其中用於類和常數的「NS」前綴來自於Cocoa的來源,NeXTSTEP。它可以在Mac OS X和iOS中使用。 「應用程序工具包」,或稱AppKit(Application Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序與圖形用戶界面交互所需的代碼。它是基於Foundation建立的,也使用「NS」前綴。它只能在Mac OS X中使用。 「用戶界面工具包」,或稱UIKit(User Interface Kit),是用於iOS的圖形用戶界面工具包。與AppKit不同,它使用「UI」的前綴。
Cocoa 構架的一個關鍵部分是其多樣的視圖模型。總體而言,它是基於由Quartz提供的PDF繪制模型的,該特性允許使用PostScript繪制自定義圖形內容,同時也自動的支持了列印機以及類似設備。由於Cocoa框架管理了全部的繪圖操作,例如裁剪,滾動,縮放等,程序員可以不再重復實現基礎的功能,而可以集中於提供程序的關鍵功能上。
3. s/mime中的p7m怎麼解析頭部的
3gp video/3gpp
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
als audio/X-Alpha5
amc application/x-mpeg
ani application/octet-stream
asc text/plain
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp application/x-MS-bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
epub application/epub+zip
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/octet-stream
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschele
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
sdp application/sdp
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv video/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowmp
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip
4. Cocoa如何應用設計模式
Cocoa經常把自己與眾不同的工作機制建立在模式上,它的設計受到諸如語言能力或現有架構這樣因素的影響。本部分包含設計模式:可重用的面向對象軟體的元素一書中編目的大多數設計模式的介紹。每個設計模式都有一個總結性的描述,以及該模式的Cocoa實現的討論。文中列出的都是Cocoa實現的模式,每個模式的討論都發生在特定的Cocoa環境中。我們推薦您熟悉這些模式,您會發現這些模式在Cocoa軟體開發中非常有用。Cocoa中設計模式的實現有不同的形式。下面部分中描述的一些設計—比如協議和范疇—是Objective-C語言的特性;在另外一些場合中,「模式的實例」被實現為一個類或一組相關的類(比如類簇和單件類);還有一些場合下,模式表現為一個大的框架結構,比如響應者鏈模式。對於某些基於模式的機制,您幾乎可以「免費」使用;而另外一些機制則要求您做一些工作。即使對於Cocoa沒有實現的模式,我們也鼓勵您在條件許可的情況下自行實現,比如在擴展類的行為時,對象合成(裝飾模式)技術通常就比生成子類更好。有兩個設計模式沒有在下面的內容中進行討論,即模型-視圖-控制器(MVC)模式和對象建模。MVC是一種復合或聚合模式,就是說它基於幾種不同類型的模式。對象建模在四人組的分類目錄中沒有對應類別,它源自關系資料庫領域。然而,MVC和對象建模在Cocoa中可能是最重要和最普遍的設計模式或用語,而且它們在很大程度上是相關的。它們在幾個技術的設計中發揮關鍵的作用,包括綁定、撤消管理、腳本控制、和文檔架構。要了解更多有關這些模式的信息,請參見"模型-視圖-控制器設計模式"和"對象建模"部分。本部分包含如下主要內容:抽象工廠模式適配器模式責任鏈模式命令模式合成模式裝飾模式表觀模式跌代器模式仲裁者模式備忘錄模式觀察者模式代理模式單件模式模板方法模式抽象工廠模式提供一個介面,用於創建與某些對象相關或依賴於某些對象的類家族,而又不需要指定它們的具體類。通過這種模式可以去除客戶代碼和來自工廠的具體對象細節之間的耦合關系。類簇類簇是一種把一個公共的抽象超類下的一些私有的具體子類組合在一起的架構。抽象超類負責聲明創建私有子類實例的方法,會根據被調用方法的不同分配恰當的具體子類,每個返回的對象都可能屬於不同的私有子類。Cocoa將類簇限制在數據存儲可能因環境而變的對象生成上。Foundation框架為NSString、NSData、NSDictionary、NSSet、和NSArray對象定義了類簇。公共超類包括上述的不可變類和與其相互補充的可變類NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet、和NSMutableArray。使用和限制當您希望創建類簇代表的類型的可變或不可變對象時,可以使用類簇中的某個公共類來實現。使用類簇是在簡潔性和擴展性之間進行折衷。類簇可以簡化類介面,因此使其更易於學習和使用,但是創建類簇抽象類的定製子類則會變得更加困難。進一步閱讀: "類簇" 部分提供有關Cocoa類簇的更多信息。 適配器模式將一個類介面轉化為客戶代碼需要的另一個介面。適配器使原本由於兼容性而不能協同工作的類可以工作在一起,消除了客戶代碼和目標對象的類之間的耦合性。協議協議是一個編程語言級別(Objective-C)的特性,它使定義適配器模式的實例成為可能(在 Java中的「介面」和「協議」是同義的)。如果您希望一個客戶對象和另一個對象進行交流,但由於它們的介面不兼容而導致困難,您就可以定義一個協議,它本質上是一系列和類不相關聯的方法聲明。這樣,其它對象的類就可以正式採納該協議,並通過實現協議中的全部方法來「遵循」該協議。結果,客戶對象就可以通過協議介面向其它對象發送消息。協議是一組獨立於類層次的方法聲明,這樣就有可能象類的繼承那樣,根據對象遵循的協議對其進行分組。您可以通過NSObject的conformsToProtocol:方法來確認一個對象的協議關系。除了正式協議之外,Cocoa還有一個非正式協議的概念。這種類型的協議是NSObject類中的一個范疇(category),這樣就使所有的對象都成為范疇方法的潛在實現者(參見"范疇"部分)。非正式協議的方法可以選擇性地實現。非正式協議是委託機制實現的一部分(參見"委託"部分。請注意,協議的設計和適配器模式並不完全匹配。但它是使介面不兼容的類在得以協同工作的手段。使用和限制協議主要用於聲明層次結構上不相關的類為了互相通訊而需要遵循的介面。但是,您也可以將協議用於聲明對象的介面,而隱藏相應的類。Cocoa框架包括很多正式協議,這些協議使定製子類可以和框架進行特定目的的通訊。舉例來說,Foundation框架中包含NSObject、NSCopying、和NSCoding協議,都非常重要。Application Kit中的協議包括NSDraggingInfo、NSTextInput、和NSChangeSpelling。正式協議要求遵循者實現協議聲明的所有方法。它們也是零碎的,一旦您定義一個協議並將它提供給其它類,將來對協議的修改會使那些類不能工作。進一步閱讀:有關正式協議的更多信息請參見Objective-C編程語言文檔中「擴展類」部分的討論。 責任鏈模式通過為多個對象提供處理請求的機會,避免請求的發送者和接收者產生耦合。將接收對象串成鏈,並將請求沿著接收者鏈進行傳遞,直到某個對象對其進行處理。對象或者處理該請求,或者將它傳遞給鏈中的下一個對象。響應者鏈Application Kit框架中包含一個稱為響應者鏈的架構。該鏈由一系列響應者對象(就是從NSResponder繼承下來的對象)組成,事件(比如滑鼠點擊)或者動作消息沿著鏈進行傳遞並(通常情況下)最終被處理。如果給定的響應者對象不處理特定的消息,就將消息傳遞給鏈中的下一個響應者。響應者在鏈中的順序通常由視圖的層次結構來決定,從層次較低的響應者對象向層次較高的對象傳遞,頂點是管理視圖層次結構的窗口對象,窗口對象的委託對象,或者全局的應用程序對象。事件和動作消息在響應者鏈中的確切傳遞路徑是不盡相同的。一個應用程序擁有的響應者鏈可能和它擁有的窗口(甚至是局部層次結構中的視圖對象)一樣多,但每次只能有一個響應者鏈是活動的—也就是與當前活動窗口相關聯的那個響應鏈。還有一個與響應者鏈相類似的鏈,用於應用程序的錯誤處理。視圖層次的設計應用的是合成模式(參見"合成模式"部分),它和響應者鏈密切相關。動作消息—源自控制項對象的消息—基於目標-動作機制,是命令模式(參見"命令模式"部分)的一個實例。使用和限制當您通過Interface Builder或以編程的方式為程序構造用戶界面時,可以「免費」得到一個或多個響應者鏈。響應者鏈和視圖層次結構一起出現,當您使一個視圖對象成為窗口內容視圖的子視圖時,視圖層次結構就自動生成了。如果您將一個定製視圖加入到一個視圖層次結構中,它就變成響應者鏈的一部分;如果您實現了恰當的NSResponder方法,就可以接收和處理事件及動作消息。定製對象是窗口對象或全局應用程序對象NSApp的委託對象,也可以接收和處理那些消息。您也可以用編程的方式將定製的響應者對象注入到響應者鏈中,以及通過編程操作響應者在鏈中的順序。進一步閱讀: 處理事件和動作消息及程序錯誤的的響應者鏈在Cocoa事件處理指南和Cocoa的錯誤處理編程指南文檔中進行描述。本文檔在"合成模式"部分對視圖層次結構有總結性的介紹,在"核心應用程序架構"部分有更全面的描述。 命令模式這種模式將請求封裝為對象,使您可以用不同的請求來對客戶代碼進行參數化;對請求進行排隊和記錄,並支持可撤消(undoable)的操作。請求對象將一或多個動作綁定在特定的接收者上。命令模式將發出請求的對象和接收及執行請求的對象區分開來。調用對象NSInvocation類的實例用於封裝Objective-C消息。一個調用對象中含有一個目標對象、一個方法選擇器、以及方法參數。您可以動態地改變調用對象中消息的目標及其參數,一旦消息被執行,您就可以從該對象得到返回值。通過一個調用對象可以多次調用目標或參數不同的消息。創建NSInvocation對象需要使用NSMethodSignature對象,該對象負責封裝與方法參數和返回值有關系的信息。NSMethodSignature對象的創建又需要用到一個方法選擇器。NSInvocation的實現還用到Objective-C運行環境的一些函數。使用和限制NSInvocation對象是分布式、撤消管理、消息傳遞、和定時器對象編程介面的一部分。在需要去除消息發送對象和接收對象之間的耦合關系的類似場合下,您也可以使用。分布式對象是一種進程間通訊技術,關於這個主題的更多信息請參見"代理模式"部分。進一步閱讀:調用對象的細節請閱讀NSInvocation的類參考文檔。您也可以從下面的文檔中獲取相關技術的信息:Objective-C編程語言文檔中的分布式對象、撤消架構、定時器以及之後的部分。 目標-動作目標-動作機制使控制項對象—也就是象按鍵或文本輸入框這樣的對象—可以將消息發送給另一個可以對消息進行解釋並將它處理為具體應用程序指令的對象。接收對象,或者說是目標,通常是一個定製的控制器對象。消息—也被稱為動作消息—由一個選擇器來確定,選擇器是一個方法的唯一運行時標識。典型情況下,控制項擁有的單元對象會對目標和動作進行封裝,以便在用戶點擊或激活控制項時發送消息(菜單項也封裝了目標和動作,以便在用戶選擇時發送動作消息)。目標-動作機制之所以能夠基於選擇器(而不是方法簽名),是因為Cocoa規定動作方法的簽名和選擇器名稱總是一樣的。使用和限制當您用Interface Builder構建程序的用戶界面時,可以對控制項的動作和目標進行設置。您因此可以讓控制項具有定製的行為,而又不必為控制項本身書寫任何的代碼。動作選擇器和目標連接被歸檔在nib文件中,並在nib文件被解檔時復活。您也可以通過向控制項或它的單元對象發送setTarget:和setAction:消息來動態地改變目標和動作。目標-動作機制經常用於通知定製控制器對象將數據從用戶界面傳遞給模型對象,或者將模型對象的數據顯示出來。Cocoa綁定技術則可以避免這種用法,有關這種技術的更多信息請參見Cocoa綁定編程主題文檔。Application Kit中的控制項和單元並不保持它們的目標。相反,它們維護一個對目標的弱引用。進一步的信息請參見"委託、觀察者、和目標的所有權" 部分。進一步閱讀:更多信息請參見"目標-動作機制"部分。 合成模式這種模式將互相關聯的對象合成為樹結構,以表現部分-全部的層次結構。它使客戶代碼可以統一地處理單獨的對象和多個對象的合成結果。合成對象是模型-視圖-控制器聚集模式的一部分。視圖層次結構一個窗口包含的視圖對象(NSView對象)在內部構成了一個視圖層次結構。層次結構的根是窗口對象(NSWindow對象)和它的內容視圖。內容視圖就是填充到窗口內容方框中的透明視圖,添加到內容視圖中的視圖都是它的子視圖,而這些子視圖又會成為下一級視圖的父視圖。一個視圖有一個(且只有一個)父視圖,可以有零或多個子視圖。在視覺上,您可以將這個結構理解為包含關系:父視圖包含它的子視圖。圖4-2顯示視圖層次的結構以及在視覺上的關系。 圖4-2 視圖層次的結構及其在視覺上的關系 視圖層次是一個結構方面的架構,在圖形描畫和事件處理上都扮演一定的角色。一個視圖有兩個影響圖形操作位置的邊界框,即邊框(frame)和邊界(bound)。邊框是外部邊界,表示視圖在其父視圖坐標系統中的位置,它負責定義視圖的尺寸,並根據視圖邊界對圖形進行裁減。邊界則是內部的邊界框,負責定義視圖對象自身描畫表面的內部坐標系統。當窗口系統要求一個窗口做好顯示准備時,父視圖會在其子視圖之前被要求進行渲染。當您向一個視圖發送消息時—比如發送一個重畫視圖的消息—該消息就會被傳播到子視圖。因此,您可以將視圖層次結構中的一個分支當成一個統一的視圖來處理。響應者鏈也把視圖層次用於處理事件和動作消息。請參見責任鏈模式部分中("責任鏈模式")關於響應者鏈的總結描述。使用和限制無論以編程的方式,還是通過Interface Builder,當您將一個視圖加入到另一個視圖中時,都需要創建或修改視圖層次結構。Application Kit框架自動處理與視圖層次結構相關聯的所有關系。進一步閱讀:如果需要了解更多視圖層次結構的信息,請閱讀本文檔的"視圖層次結構"部分。Cocoa描畫指南文檔中也對視圖層次結構進行討論。 裝飾模式這種模式動態地將額外的責任附加到一個對象上。在進行功能擴展時,裝飾是子類化之外的一種靈活的備選方法。和子類化一樣,採納裝飾模式可以加入新的行為,而又不必修改已有的代碼。裝飾將需要擴展的類的對象進行包裝,實現與該對象相同的介面,並在將任務傳遞給被包裝對象之前或之後加入自己的行為。裝飾模式表達了這樣的設計原則:類應該接納擴展,但避免修改。一般性的說明裝飾是用於對象合成的模式。在您自己的代碼中應該鼓勵使用對象的合成(參見"什麼時候需要生成子類"部分)。然而,Cocoa自己提供了一些基於這種模式的類和機制(在下面的部分進行討論)。在這些實現中,擴展對象並不完全復制它所包裝的對象的介面,雖然具體實現中可以使用不同的技術來進行介面共享。Cocoa在實現某些類時用到了裝飾模式,包括NSAttributedString、NSScrollView、和NSTableView。後面兩個類是復合視圖的例子,它們將其它一些視圖類的對象組合在一起,然後協調它們之間的交互。委託委託是在宿主對象中嵌入一個指向另一對象(也就是委託對象)的弱引用(一個未保持的插座變數),並不時地向該委託對象發送消息,使其對有關的任務進行輸入的機制。宿主對象一般是一個「復活」的框架對象(比如一個NSWindow或NSXMLParser對象),它尋求完成某項工作,但又只能以一般的方式來進行。委託幾乎總是一個定製類的實例,它負責配合宿主對象,在有關任務的特定點(參見圖4-3)上提供與具體程序有關的行為。這樣,委託機制使我們可以對另一個對象的行為進行修改或者擴展,而不需要生成子類。 圖4-3 框架對象向它的委託對象發送消息 簡而言之,委託就是一個對象將任務委託給另一個對象,它是面向對象編程的常用技術。然而,Cocoa以獨特的方式實現委託機制。宿主類用非正式協議—即NSObject中的范疇—來定義委託對象可能選擇實現的介面。委託對象不必象採納正式協議那樣實現所有的協議方法。在向委託對象發送消息之前,宿主對象可以首先確定相應的方法是否實現(通過respondsToSelector:消息),以避免運行時例外。有關正式協議和非正式協議的更多信息,請參見"協議"部分。Cocoa框架中的一些類也向它們的數據源發送消息。數據源在各個方面都和委託一樣,除了它的目的是為宿主對象提供數據,以傳遞給瀏覽器、表視圖、或者類似的用戶界面視圖。和委託不同的是,數據源還必須實現某些協議方法。委託不是裝飾模式的嚴格實現。宿主(委託)對象並沒有包裝它希望擴展的類的實例。相反,委託是對委託框架類的行為進行特殊化。除了框架類聲明的委託方法之外,它們也沒有公共的介面。Cocoa中的委託也是模板方法模式("模板方法模式")的一部分。使用和限制委託是Cocoa框架中的一種常用的設計。Application Kit框架中的很多類都向它們的委託發送消息,包括NSApplication、NSWindow、和NSView的幾個子類。Foundation框架中的一些類,比如NSXMLParser和NSStream,也維護自己的委託。您應該總是使用類的委託機制,而不是生成類的子類,除非委託方法不能完成您的目標。雖然您可以動態地改變委託,但是同時只能有一個對象可以成為委託。因此,如果您希望當特定的程序事件發生時,有多個對象可以同時得到通知,則不能使用委託。在這種情況下您可以使用通告機制。如果委託對象實現了一或多個框架類聲明的通告方法,就會自動接收到其委託框架對象的通告。請參考觀察者模式( "觀察者模式")中有關通告的討論。Application Kit框架中的向外委託任務的對象並不保持它們的委託或數據源,而是維護一個弱引用,更多信息請參見"委託、觀察者、和目標的所有權"部分。進一步閱讀:關於委託的進一步信息請參見"委託和數據源"部分。 范疇范疇是Objective-C語言的一個特性,用於為一個類增加方法(介面和實現),而不必生成子類。類原始聲明的方法和通過范疇添加的方法在運行時沒有區別—在您的程序的作用范圍內。范疇中的方法成為類類型的一部分,並被所有的子類繼承。和委託一樣,范疇並沒有嚴格適配裝飾模式。它實現了該模式的目的,但採用不同的實現方式。范疇加入的行為是在編譯時生成的,而不是動態得到的。而且,范疇並沒有封裝被擴展的類的實例。使用和限制Cocoa框架中定義了很多范疇,大多數都是非正式協議(在"協議"部分中進行總結)。它們通常使用范疇來對相關的方法進行分組。您也可以在代碼中實現范疇,以在不生成子類的情況下對類進行擴展,或者對相關的方法進行分組。但是您需要注意如下兩點:您不能為類添加實例變數。如果您對現有的方法進行重載,則應用程序可能產生預料之外的行為。進一步閱讀: 更多有關范疇的信息請參見Objective-C編程語言一文中的「類的擴展」部分。 表觀模式這種模式為子系統中的一組介面提供統一的介面。表觀模式定義一個更高級別的介面,通過減少復雜度和隱藏子系統之間的通訊和依賴性,使子系統更加易於使用。NSImageNSImage類為裝載和使用基於點陣圖(比如JPEG、PNG、或者TIFF格式)或向量(EPS或PDF格式)的圖像提供統一的介面。NSImage可以為同一個圖像保持多個表示,不同的表示對應於不同類型的NSImageRep對象。NSImage可以自動選擇適合於特定數據類型和顯示設備的表示。同時,它隱藏了圖像操作和選擇的細節,使客戶代碼可以交替使用很多不同的表示。使用和限制由於NSImage支持幾種不同的圖像表示,因此某些屬性可能不能適用。舉例來說,您可能不能取得圖像中一個像素的顏色,如果潛在的圖像表示使基於向量且與設備無關的話。請注意:NSImage和圖像表示的討論請參見Cocoa描畫指南。 迭代器模式這種模式提供一種順序訪問聚合對象(也就是一個集合)中的元素,而又不必暴露潛在表示的方法。迭代器模式將訪問和遍歷集合元素的責任從集合對象轉移到迭代器對象。迭代器定義一個訪問集合元素的介面,並對當前元素進行跟蹤。不同的迭代器可以執行不同的遍歷策略。NSEnumeratorFoundation框架中的NSEnumerator類實現了迭代器模式。NSEnumerator抽象類的私有具體子類返回的枚舉器對象可以順序遍歷不同類型的集合—數組、集合、字典(值和鍵)—並將集合中的對象返回給客戶代碼。NSDirectoryEnumerator是一個不緊密相關的類,它的實例可以遞歸地枚舉文件系統中目錄的內容。使用和限制象NSArray、NSSet、和NSDictionary這樣的集合類都包含相應的方法,可以返回與集合的類型相適用的枚舉器。所有的枚舉器的工作方式都一樣。您可以在循環中向枚舉器發送nextObject消息,如果該消息返回nil,而不是集合中的下一個對象,則退出循環。仲裁者模式這種模式定義的對象用於封裝一組對象的交互機制。仲裁者模式可以避免對象之間顯式的互相引用,使對象之間的耦合變得寬松,也使您可以獨立地改變它們的交互方式。這些對象也因此可以更具重用性。仲裁者對象集中了系統中的對象之間的復雜通訊和控制邏輯。這些對象在狀態發生改變時會告訴仲裁者對象,反過來,也對仲裁者對象的請求進行響應。控制器類模型-視圖-控制器設計模式為一個面向對象的系統(比如一個應用程序)中的對象分配不同的角色。它們可以是模型對象,包含應用程序的數據及對那些數據進行操作;可以是視圖對象,負責表示數據及響應用戶動作;也可以是控制器對象,負責協調模型和視圖對象。控制器對象適合於仲裁者模式。在Cocoa中,控制器對象一般有兩個類型:仲裁控制器或者協調控制器。仲裁控制器負責仲裁應用程序中視圖對象和模型對象之間的數據流。仲裁控制器通常是NSController對象。協調控制器則負責實現應用程序的集中化通訊和控制邏輯,作為框架對象的委託和動作消息的目標。它們通常是NSWindowController對象或定製NSObject子類的實例。由於協調控制器高度專用於特定的程序,因此不考慮重用。Application Kit框架中的NSController抽象類和它的具體子類是Cocoa綁定技術的一部分,該技術可以自動同步模型對象包含的數據和視圖對象中顯示及編輯的數據。舉例來說,如果用戶在一個文本框中編輯一個字元串,綁定技術會將文本框中的變化(通過仲裁控制器)傳遞給綁定了的模型對象中合適的屬性。編程者需要做的就是正確設計自己的模型對象,並通過Interface Builder在程序的視圖、控制器、和模型對象之間建立綁定關系。具體的公共控制器類的實例可以在Interface Builder的控制項選盤上得到,因此是高度可重用的。它們提供一些服務,比如選擇和佔位符值的管理。這些對象執行下面這些特定的功能:NSObjectController 管理一個單獨的模型對象。NSArrayController 管理一個模型對象數組,以及維護一個選擇;還可以在數組中加入或刪除模型對象。NSTreeController 使您可以在一個具有層次的樹結構中添加、刪除、和管理模型對象。NSUserDefaultsController 為預置(用戶預設值)系統提供一個便利的介面。使用和限制您通常可用將NSController對象用作仲裁控制器,因為這些對象的設計目的是在應用程序的視圖對象和模型對象之間傳遞數據。在使用仲裁控制器時,您通常是從Interface Builder選盤中拖出對象,指定模型對象的屬性鍵,並通過Interface Builder Info 窗口中的Bindings面板建立視圖和模型對象之間的綁定關系。您也可以生成NSController或其子類的子類,以獲得更具具體行為的子類。幾乎任何一對對象之間都可以建立綁定關系,只要它們遵循NSKeyValueCoding和NSKeyValueObserving這兩個非正式協議。但是,我們推薦您通過仲裁控制器來建立綁定,以得到NSController及其子類為您提供的各種好處。協調控制器通過下面的方式集中實現一個應用程序的通訊和控制邏輯:維護指向模型和視圖對象的插座變數(插座變數是指向其它被保持為實例變數的連接或引用)。通過目標-動作機制響應用戶在視圖對象上的操作(參見"目標-動作"部分)。作為委託對象,處理從框架對象發出的消息(參見"委託"部分)。您通常可以在Interface Builder中建立上述的連接—插座變數、目標-動作、和委託,它將這些連接歸檔到應用程序的nib文件中。進一步閱讀: 有關仲裁控制器、協調控制器、和與控制器有關的設計決定的討論,請參見"模型-視圖-控制器設計模式"部分。 備忘錄模式這種模式在不破壞封裝的情況下,捕捉和外部化對象的內部狀態,使對象在之後可以回復到該狀態。備忘錄模式使關鍵對象的重要狀態外部化,同時保持對象的內聚性。歸檔歸檔將一個程序中的對象以及對象的屬性(包括屬性和關系)存儲到檔案上,使之可以保存到文件系統中,或者在不同的處理器和網路間傳遞。檔案將程序的對象圖保存為獨立於架構的位元組流,對象的標識和對象之間的關系都會被保留。由於對象的類型和它的數據一起被存儲,從歸檔的位元組流解碼出來的對象會被正常實例化,實例化所用的類與原來編碼的類相同。使用和限制通常情況下,您希望將程序中需要保存狀態的對象歸檔。模型對象幾乎總是屬於這個范疇。您通過編碼將對象寫入到檔案中,而通過解碼將對象從檔案中讀取出來。通過NSCoder對象可以執行編解碼操作,在編解碼過程中最好使用鍵化的歸檔技術(需要調用NSKeyedArchiver和NSKeyedUnarchiver類的方法)。被編解碼的對象必須遵循NSCoding協議;該協議的方法在歸檔過程中會被調用。進一步閱讀: 有關歸檔的進一步信息。 屬性列表的序列化屬性列表是一個簡單的、具有一定結構的對象圖序列,它僅使用下面這些類的對象:NSDictionary、NSArray、NSString、NSData、NSDate、和NSNumber。這些對象通常也被稱為屬性列表對象。Cocoa中有幾個框架類提供了序列化屬性列表對象,以及定義錄寫對象內容及其層次關系的特殊數據流格式的方法。NSPropertyListSerialization類就提供了將屬性列表對象序列化為XML或其它優化的二進制格式的類方法。使用和限制如果對象圖中包含的是簡單對象,則在捕捉和外部化對象及其狀態時,屬性列表序列化是一種靈活的、可移植的、而又非常適當的工具。然而,這種形式的序列化有它的限制,它不保留對象的全部類標識,而只保留一些一般的類型(數組、字典、字元串、等等)。這樣,從屬性列表恢復出來的對象可能和原來的類不同,特別是當對象的可變性可能發生變化時,這就會帶來問題。屬性列表序列化也不跟蹤在同一對象中被多次引用的對象,這可能導致反向序列化時產生多個實例,而在原來的對象圖中卻只有一個實例。進一步閱讀: 有關屬性列表序列化的更多信息。 Core DataCore Data是一個管理對象圖,並使其留存的框架和架構。正是第二種能力—對象的留存能力—使Core Data成為備忘錄模式的一種適配形式。在Core Data架構中,中心的對象稱為被管理對象上下文,負責管理應用程序對象圖中的模型對象。在被管理對象上下文下面是該對象圖的持久棧,也就是一個框架對象的集合,負責協調模型對象和外部數據存儲,比如XML文件或關系資料庫。持久棧對象負責建立存儲中的數據和被管理對象上下文中的對象之間的映射關系,在有多個數據存儲的時候,持久棧對象將這些存儲表現為被管理對象上下文中的一個聚合存儲
5. cocoa是什麼意思
Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是Mac OS X上五大API之一(其它四個是Carbon、POSIX、X11和Java)。
蘋果的面向對象開發框架,用來生成 Mac OS X 的應用程序。主要的開發語言為 Objective-c, 一個c 的超集。 Cocoa 開始於1989年9月上市的NeXTSTEP 1.0,當時沒有Foundation框架,只有動態運行庫。
發展歷史
Cocoa 是從1980年代由 NeXT 開發的編程環境NeXTSTEP 和 OPENSTEP 演變而來,這點可由其類別之名皆以 NS 前綴(代表NeXTSTEP)看出端倪。
蘋果電腦公司在1996年12月收購了NeXT。開發 NeXTSTEP 和 OPENSTEP 的大量工作都轉化到了 Mac OS X 中,最顯而易見的部分當屬 Cocoa。
但差異也存在。例如,NeXTSTEP 和 OPENSTEP 使用 Display Postscript 實現文字和圖形的屏幕顯示,而 Cocoa 依賴蘋果的 Quartz(基於 PDF 的繪圖模型)。
以上內容參考:網路-Cocoa
6. 如何安裝homebrew-cask
安裝homebrew cask
homebrew cask可用於mac應用程序或套件,比如mactex,xtrafinder等。
brew install caskroom/cask/brew-cask
使用homebrew管理軟體
1、安裝軟體
比如安裝emacs和vim的命令分別如下。
2、安裝emacs
brew install emacs --with-cocoa --with-gnutls
3、安裝macvim
brew install macvim --with-override-system-vim
安裝ack和ag,比grep好用
brew install ack ag
4、安裝autojump,非常高效的目錄跳轉工具
brew install autojump
查找軟體包
比如查找和pdf相關的軟體包。
1、查找和pdf相關的軟體包
brew search pdf
刪除軟體包
1、移除macvim
brew remove macvim
清除老版本的安裝包
1、homebrew 會緩存下載的安裝包,長時間不清理會佔用大量的磁碟空間,因此需要定期清理,清理命令如下:
brew cleanup
7. cocoa和foundation框架的區別
區別是:
Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是Mac OS X上五大API之一(其它四個是Carbon、POSIX、X11和Java)。不過,通過Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等橋接技術,Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者語言也可以用來開發 Cocoa 應用。也有一些其它語言的Cocoa實現無須橋接,比如蘋果公司開發的MacRuby和類似Lisp的Nu語言。不使用Xcode和Interface Builder,僅僅通過文本編輯器、GCC和GNU make工具也可以用Objective-C語言開發Cocoa應用。
Foundation—基礎框架。框架中包含了很多開發中常用的數據類型,如結構體,枚舉,類等,是其他ios框架的基礎。如果要想使用foundation框架中的數據類型,那麼包含它的主頭文件就可以了。即#import<foundation/foundation.h>。
補充:core foundation框架相對底層,裡面的代碼幾乎都是c語言的,而foundation中是OC的。
Cocoa不是一種編程語言(它可以運行多種編程語言),它也不是一個開發工具(通過命令行我們仍然可以開發Cocoa程序),它是創建Mac OS X和IOS程序的原生面向對象API,為這兩者應用提供了編程環境。通常稱為「Cocoa框架」,事實上Cocoa本身是一個框架的集合,它包含了眾多子框架,其中最重要的要數「Foundation」和「UIKit」。前者是框架的基礎,和界面無關,其中包含了大量常用的API;後者是基礎的UI類庫。
8. 求薩繆爾森的《經濟學》 (中文和英文的 PDF) 史蒂芬.羅斯的 《公司理財》
只有薩繆爾森的《經濟學》12版的中文,要不要?
9. 《TheSwiftProgrammingLanguage》pdf下載在線閱讀,求百度網盤雲資源
《The Swift Programming Language》(Apple Inc.)電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/1CaDcw_ulyRog3ohxnuYOFg
書名:The Swift Programming Language
作者:Apple Inc.
豆瓣評分:8.5
出版年份:2014-6-2
內容簡介:
Swift is a new programming language for creating iOS and OS X apps. Swift builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe programming patterns and adds modern features to make programming easier, more flexible, and more fun. Swift』s clean slate, backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an opportunity to reimagine how software development works.
This book provides:
- A tour of the language.
- A detailed guide delving into each language feature.
- A formal reference for the language.