框架是一個目錄,包含了共用資源庫,用於訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其他資源。 共用資源庫定義應用程式可以調用的函數和方法。 iOS 提供了許多可在應用程式開發中使用的框架。 要使用一個框架,請將它添加到項目,以便應用程式可以鏈接到它。 大多數應用程式都鏈接到 Foundat ...
-
- 框架是一個目錄,包含了共用資源庫,用於訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其他資源。
- 共用資源庫定義應用程式可以調用的函數和方法。
- iOS 提供了許多可在應用程式開發中使用的框架。
- 要使用一個框架,請將它添加到項目,以便應用程式可以鏈接到它。
- 大多數應用程式都鏈接到 Foundation、UIKit 和 Core Graphics 框架。根據您為應用程式選取的模板,可能也包括其他框架。
- 如果一組核心框架無法滿足應用程式的要求,您總是可以將其他框架添加到項目。
- 每個框架都屬於 iOS 系統的一個層。每個層都建立在它的下層之上。儘可能使用較高級的框架,而非較低級的框架。較高級的框架向較低級的結構提供面向對象的抽象。
-
Foundation 框架為所有應用程式提供基本的系統服務
您的應用程式以及 UIKit 和其他框架,都建立在 Foundation 框架的基礎結構之上。
-
Foundation 框架提供許多基本的對象類和數據類型,使其成為應用程式開發的基礎。
-
它還制定了一些約定(用於取消分配等任務),使您的代碼更加一致,可再用性更好。
使用 Foundation:
-
創建和管理集,如數組和字典
-
訪問儲存在應用程式中的圖像和其他資源
-
創建和管理字元串
-
發佈和觀察通知
-
創建日期和時間對象
-
自動發現 IP 網路上的設備
-
操控 URL 流
-
非同步執行代碼
在“您的首個 iOS 應用程式”中,您就使用了 Foundation 框架。例如,您使用了
NSString
類的實例,將用戶的輸入儲存在userName
中。 -
-
您還使用了 Foundation 實例方法
initWithFormat:
,創建問候語字元串。UIKit 框架提供的類,可用於創建基於觸摸的用戶界面
所有 iOS 應用程式都基於 UIKit。沒有這個框架,就無法交付應用程式。
-
UIKit 提供基礎結構,用於在屏幕上繪圖、處理事件,以及創建通用用戶界面元素。
-
UIKit 還通過管理屏幕上顯示的內容,來組織複雜的應用程式。
使用 UIKit:
-
構建和管理用戶界面
-
處理基於觸摸和運動的事件
-
顯示文本和網頁內容
-
優化應用程式以實現多任務
-
創建自定用戶界面元素
在“您的首個 iOS 應用程式”中,您使用了 UIKit。檢查應用程式如何啟動時,您看到了
UIApplicationMain
函數,它創建了UIApplication
類(處理傳入的用戶事件)的一個實例。您實現了UITextFieldDelegate
協議,以便在用戶輕按“Done”鍵時,讓鍵盤消失。事實上,您使用了 UIKit 中的UITextField
、UILabel
和UIButton
類,創建了整個界面。您應該瞭解的其他重要框架
Core Data、Core Graphics、Core Animation 和 OpenGL ES 框架,是對於應用程式開發很重要的高級技術,因此需要花時間來學習和掌握。
Core Data 框架管理應用程式的數據模型
Core Data 管理對象圖。藉助 Core Data,您可以創建模型對象(稱為被管理的對象)。您管理那些對象之間的關係,並通過框架更改數據。
-
-
Core Data 利用內建的 SQLite 技術,高效地儲存和管理數據。
使用 Core Data:
-
存儲對象和從儲存處取回對象
-
支持基本的撤銷/重做
-
自動驗證屬性值
-
對記憶體中的數據進行過濾、分組和整理
-
使用
NSFetchedResultsController
管理表格視圖中的結果 -
支持基於文稿的應用程式
Core Graphics 框架幫助您創建圖形
高質量的圖形,是所有 iOS 應用程式的一個重要組成部分。在 iOS 中創建圖形的最簡易便捷方法,是將預渲染的圖像與 UIKit 框架的標準視圖和控制配合使用,並讓 iOS 完成繪圖。UIKit 還提供用於自定繪圖的類,包括路徑、顏色、圖案、漸變、圖像、文本和變換。儘可能地使用 UIKit(較高級的框架),而非 Core Graphics(較低級的框架)。
當您想要編寫在 iOS 和 OS X 之間直接共用的繪圖代碼時,使用 Core Graphics。Core Graphics 框架也稱為 Quartz,它在這兩個平臺上幾乎相同。
使用 Core Graphics:
-
製作基於路徑的繪圖
-
使用邊緣模糊化渲染
-
添加漸變、圖像和顏色
-
使用坐標空間變換
-
創建、顯示和解析 PDF 文稿
Core Animation 可讓您製作高級動畫和視覺效果
UIKit 提供的動畫,是建立在 Core Animation 技術之上的。如果您需要超出 UIKit 功能的高級動畫,可以直接使用 Core Animation。
-
-
Core Animation 介面包含在 Quartz Core 框架中。藉助 Core Animation,您創建不同層次的層對象,並對它們進行操控、旋轉、縮放、變換等等。
-
通過使用大家所熟悉的 Core Animation 視圖式抽象,您可以創建動態用戶界面,而無需使用低級的圖形 API,如 OpenGL ES 等。
使用 Core Animation:
-
創建自定動畫
-
給圖形添加時序功能
-
支持關鍵幀動畫
-
指定圖形佈局約束
-
將多層更改分組為原子更新
OpenGL ES 框架提供 2D 和 3D 繪圖工具
OpenGL ES 支持基礎的 2D 和 3D 繪圖。Apple 實施的 OpenGL ES 標準,與設備硬體緊密協作,為全屏幕游戲類應用程式提供很高的幀速率。
使用 OpenGL ES:
-
創建 2D 和 3D 圖形
-
製作更複雜的圖形,如數據可視化、飛行模擬或視頻游戲。
-
訪問底層圖形硬體
瞭解 iOS API 和 OS X API 之間的異同
如果您是 Mac 開發者,您會發現 Cocoa 和 Cocoa Touch 應用程式都基於類似的技術。它們具有共同的 API,使得從 Cocoa 遷移更簡單。
-
-
事實上,部分框架是相同(或幾乎相同)的,例如 Foundation 和 Core Data。但是,其他框架與其 OS X 相應的框架有差異。
-
AppKit 和 UIKit 尤其如此。因此,在將 Mac 應用程式遷移到 iOS 時,必須替換大量界面相關的類,以及與這些類相關的代碼
將代碼與框架整合
-
-
您為 iOS 或 OS X 開發應用程式時,不會是完全孤立的。您將沿用 Apple 和其他人的勞動成果,沿用他們在 Objective-C 框架中開發和收集的類。
-
框架是運行時可供多個進程共用的類資源庫;它包含支持採用該資源庫進行軟體開發的資源。
-
Cocoa 和 Cocoa Touch 框架,為您提供了一組相互依賴的類,它們共同工作,以構成應用程式的一部分(通常是相當重要的一部分)。
針對您要編寫的程式,您可以按需從一個 C 函數庫中選用函數,並確定何時調用它們。
-
另一方面,框架會將某種設計強加於您的程式,或至少強加於您的程式要嘗試解決的某個問題空間。
-
使用面向對象的框架時,可以調用框架中的類的方法,來執行程式的大部分工作,就和過程化程式中一樣。
-
但是,您也還需要定製泛型框架行為,並通過實施一些方法,讓框架在適當時候調用這些方法,對框架行為進行調整,以滿足您的需要。
-
這些方法作為鉤子 (hook),將您的代碼引入到框架所施加的結構中,增加了能使您的應用程式特征化的行為。
-
應用程式由事件驅動
-
- 通過考慮應用程式啟動時會發生什麼,可以一窺您編寫的代碼和框架代碼之間的關係。
- 基本上,應用程式建立一組核心對象,然後將控制權移交給這些對象。
- 隨著程式的運行,越來越多的對象會被創建,但是程式最初所需的,卻只是足以處理初始任務的結構(即足夠的核心對象網路)。
- 有兩個主要任務:
- 繪製應用程式的初始用戶界面。
- 處理用戶與該用戶界面互動時收到的事件。
-
- 初始用戶界面顯示在屏幕上之後,應用程式由外部事件驅動。最重要的外部事件源自用戶(例如輕觸按鈕)。
- 操作系統將這些事件及其相關信息一起報告給應用程式。該應用程式(由您的代碼和框架代碼組成)處理事件,並相應地更新用戶界面。
- 應用程式獲取事件,並作出響應(通常是通過繪製部分用戶界面),然後等待下一個事件。
- 應用程式不斷獲取事件,一個接一個,只要用戶或其他源(例如計時器)發起事件。
- 從應用程式啟動到終止,它所做的幾乎所有事情,都是由用戶的操作,以事件的形式來驅動。
- 獲取事件和對事件做出響應的機制,就是主要事件迴圈。
- 在應用程式的一組核心對象中,有一個對象(即全局應用程式對象)負責管理主要事件迴圈。
- 它獲取事件,將事件分派給該對象或能最好地處理事件的對象,然後獲取下一個事件。
- 下圖說明瞭 iOS 中 Cocoa Touch 應用的主要事件迴圈。
使用面向對象的框架
-
- Cocoa 和 Cocoa Touch 框架不光是將提供各自服務的各個類混雜在一起的雜物袋。
- 這些面向對象的框架是類的集合,每個類構建一個問題空間,並提供完整的解決方案。
- 框架提供的不是根據需要可以使用的離散服務(如函數庫),而是制訂並實現整個應用程式的結構,您編寫的代碼則必須適應該結構。
- 因為此應用程式結構是通用的,您可以使其特殊化,以滿足特定應用的要求。
- 與其說是設計一個程式,並插入資源庫函數,不如說是將應用程式代碼,插入到框架提供的設計中。
- 要使用框架,您必須接受它定義的應用程式結構,然後根據需要,儘可能多的使用和定製它的類,將特定的應用進行改造,以適合該結構。
- 框架中的類相互依賴構成一個整體,並不是單個的。乍一看,在應用程式中要求您的代碼適應框架的結構,似乎有限制性。
- 事實剛好相反。框架為您提供了很多方式,來修改和擴展其通用行為。
- 它只要求您接受這樣的觀點,所有應用都以同樣的基本方式來運行,因為這些應用全部基於同樣的結構。
- 從廣義的隱喻層面而言,Objective-C 框架就像房屋的框架,而應用程式代碼就好比大門、窗戶、壁板和其他元素,是這些東西讓房子與眾不同。
-
從使用框架和將代碼與框架整合的觀點看,有兩種總的類:
-
現成的。一些類定義了現成對象,也就是可以隨時使用的對象。您只需要創建類的實例,然後根據需要使用這些實例。
-
通用的(或泛型)。對於泛型框架類,您可以(在有些情況下必須)創建它們的子類,並覆蓋某些方法的實現。
-
通過對它們進行子類化,將代碼引入到應用程式結構中。框架會在適當的時刻,調用子類的方法。
將泛型框架類子類化,是將程式特定的代碼,整合到框架所提供的結構中的主要技巧。但這並不是唯一技巧,而且在很多情況下,也不是首選的技巧。
-
-
在後面的文章中,您將會學習到 Cocoa Touch 和 Cocoa 框架,也包括架構和機制,二者都基於設計模式,可以實現框架對象和自定對象間的更大合作與協調。
創建子類時,需要做出兩個基本決定:決定從哪個類(超類)繼承和要覆蓋該類的哪個方法
繼承 Cocoa 或 Cocoa Touch 類
-
- 框架(如 UIKit)定義的結構,因為是泛型結構,可供很多類型的應用程式共用。
- 因為結構是泛型的,所以有一些框架類是抽象的或有意不完整的,這也不足為奇。
- 這樣的類通常實現大量的常見代碼,但卻讓工作的重要部分,要麼未完成,要麼以安全的預設方式完成。
- 將特定於應用的行為,添加到框架的主要方式,就是創建其中一個框架類的自定子類。
- 子類填補了其超類中的這些空隙,提供了框架類所缺少的部分。
- 自定子類的實例,占據其在框架所定義的對象網路中的位置,也繼承框架與其他對象合作的能力。
- 要讓應用程式做任何有用的事情,它必須創建至少一個子類,大多數情況下需要創建很多子類
-
何時創建子類
子類化是這樣一個過程:重新使用現有的類並將其特殊化,以滿足您的需要。
-
有時候一個子類所需要做的,僅是覆蓋單個繼承的方法,並讓該方法做一些與原來的行為稍微不同的事情。
-
其他子類可能添加一個或兩個屬性到其超類中(作為實例變數),然後定義方法來訪問並操作這些屬性,將它們整合到超類行為。
- 瞭解框架。您應該熟悉框架中的每個類的目的和功能。首先,閱讀開發者資源庫中框架的介紹,然後掃描框架的類的列表。
- 可能存在著某個類,已經完成了您想要執行的操作。如果找到了一個類,可以完成幾乎所有您想要執行的操作,您算走運了。該類很大可能會是您的自定類的超類。
- 應該十分明確您要應用程式做什麼。這個忠告適用於應用程式整體,也適用於應用程式的特定部分。
- 一些框架架構會施加它們自己的子類化要求。例如,如果應用程式是基於文稿的,則必須創建一個抽象的文稿類子類。
- 定義子類實例扮演的角色。在開發 iOS 或 OS X 應用程式時,“模型-視圖-控制器”設計模式用於為對象分配角色。
- 視圖對象出現在用戶界面上;模型對象保存應用程式數據(並實施作用於該數據的演算法);控制器對象充當視圖和模型對象之間的媒介。
- 瞭解對象所扮演的角色,可以縮窄使用哪個超類的決定。例如,如果想要在 iOS 應用程式中自定繪製,可能必須創建
UIView
(為 UIKit 框架中的基礎視圖類)的子類。 -
儘管子類化在為 iOS 和 OS X 應用程式編程中具有重要作用,但有時候不是解決問題的最佳方式。
-
如果只想要為一個類添加一些便捷方法,您可能要創建類別,而不是子類。
-
或者,要加入應用程式特定的行為,可以基於設計模式,使用框架中眾多其他資源中的一種,例如委托。
-
請記住,一些框架類不可以創建子類。參考文稿告訴您某一個框架類是否該用於創建子類。
-
覆蓋方法
您可以創建不重新實施任何超類方法的子類,例如該子類可能添加額外狀態,並定義新的方法來訪問狀態及調用該超類的方法。
-
但是,對於一些子類而言,主要任務便是實施一組特定的、由超類(或超類所採用的協議中)所聲明的方法。重新實施繼承的方法,稱為覆蓋該方法。
在框架類中定義的大多數方法,都屬於完整實施;它們的存在是讓您可以調用它們,以獲取該類所提供的服務。
-
您很少需要覆蓋這些方法,也不應嘗試這麼做。您可以覆蓋其他框架方法,但是很少有必要這麼做。
然而,一些框架方法是用於被覆蓋的;它們的存在是讓您將程式特定的行為添加到框架。
-
一般來說,由這些框架實施的方法,所做的工作對您的應用程式來說沒有多大價值,甚至沒有價值。
-
要將內容賦予這些方法,應用程式必鬚根據自身要求實施這類方法。應用程式運行期間,框架在適當的時候調用這些方法
-
調用還是覆蓋?
在子類中覆蓋的框架方法,一般不是要親自調用的方法,至少不是直接的調用。只需要重新實施該方法,剩下的事情就交給框架處理。
-
事實上,您越是編寫應用程式特定版本的方法,在自己的代碼中調用它的可能性就越小。
-
一般來說,框架類會聲明公共方法,以便作為開發者的您可以使用它們來執行以下兩項操作中的一項:
-
調用它們,以使用該類提供的服務。
-
覆蓋它們,以便將您的代碼引入到框架定義的程式模型中。
有時候,一個方法同時歸入這兩個類別;在調用時提供有價值的服務,也可以加以策略性的覆蓋。
-
-
但是,在大多數情況下,如果方法可供調用,則它已經由框架完全定義,您就不需要再在代碼中重新定義它。
-
如果是需要在子類中重新實施的方法,框架會用它來執行特定的任務,因此,它會在適當的時候,自行調用該方法。下圖描述兩大類型的框架方法。
-
-
上圖中,自定類 (
myMethod
) 的假設方法調用由框架實施的setNeedsDisplay:
方法。 -
框架做一些工作為繪製建立環境,然後調用框架聲明的方法
drawRect:
,該方法則由自定類覆蓋,以執行實際的繪製。覆蓋一個方法不必是一項艱巨的任務。通過編寫一兩行代碼,小心地重新實施一個方法,常常就可以對超類行為做出重大改變。
-
調用超類實現
覆蓋框架方法時,必須決定是否要替換繼承的方法的行為,或者擴展或補充該行為。
-
如果想要替換現有的行為,提供自己的方法實現即可;如果想要擴展該行為,調用超類實現並提供自己的代碼即可。
通過發送消息(與調用方法的消息相同)到
super
來調用超類實現。通過將消息發送給super
,您就將該方法的超類代碼插入到重新實現的調用點。 -
舉個例子,比如一個假設的
Celebrate
類,定義了一個稱為performFireworks
的方法。 -
在框架於視圖中繪畫並播放煙火動畫後,您想在視圖顯示一個橫幅。下圖說明在這種情況下調用
super
的方式: -
因此,決定是否調用
super
,基於您打算如何重新實施方法:-
如果打算補充超類實現的行為,請調用
super
。 -
如果打算替換超類實現的行為,就不要調用
super
。
如果您要補充超類行為,另一個需要重點考慮的,是何時調用一個方法的超類實現。您可能想超類代碼在執行您的代碼前,就做好它的工作,反之亦然。
-