學習主要框架

来源:https://www.cnblogs.com/ken134207/archive/2019/01/05/10225597.html
-Advertisement-
Play Games

框架是一個目錄,包含了共用資源庫,用於訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其他資源。 共用資源庫定義應用程式可以調用的函數和方法。 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 中的 UITextFieldUILabel 和 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

      如果您要補充超類行為,另一個需要重點考慮的,是何時調用一個方法的超類實現。您可能想超類代碼在執行您的代碼前,就做好它的工作,反之亦然。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查詢性能低下最基本的原因是訪問的數據太多。某些查詢不可避免的需要篩選大量數據,但這並不常見。大部分性能低下的查詢都可以通過減少訪問的數據量的方式進行優化 ...
  • 第一題:求單月訪問次數和總訪問次數 1.數據說明 (1)欄位數據說明 (2)數據格式 2.數據準備 (1)創建表 (2) 導入數據 (3) 驗證數據 3.結果需求 4.思路分析 (1)先求出用戶每個月的訪問次數 (2)利用其之前創建的視圖,利用視窗函數就可以擺脫select後面的欄位必須出現在gro ...
  • Sqoop 本文所使用的Sqoop版本為1.4.6 1.官網 ...
  • 分頁從資料庫返回一張表的某些條數據 假設我需要查詢 系統表 sys.all_columns中的數據,每次查詢10條 第一次查詢第1-10條數據 第二次查詢第11-20條數據 第三次查詢第21-30條數據 ......以此類推 於是我想到了sqlserver的ROW_NUMBER()排序函數,可以根據 ...
  • 抽象等級(Levels of Abstraction) Flink提供不同級別的抽象來開發流/批處理應用程式。 Statefule Stream Processing: 是最低級別(底層)的抽象,只提供有狀態的流。它通過ProcessFunction嵌入到DataStream API之中。它使得用戶 ...
  • 打開資料庫sql管理 在資料庫中新建查詢 如何輸入: exec sp_attach_db @dbname='YourDataBaseName', @filename1='mdf文件路徑', @filename2='ldf文件路徑' 如果提示:無法打開物理文件 系統拒絕訪問 可以先把資料庫複製到你的根 ...
  • 刪除用戶定義的資料庫角色註意事項 無法從資料庫刪除擁有安全對象的角色。 若要刪除擁有安全對象的資料庫角色,必須首先轉移這些安全對象的所有權,或從資料庫刪除它們。 無法從資料庫刪除擁有成員的角色。 若要刪除擁有成員的角色,必須首先刪除角色的成員。 若要刪除資料庫角色中的成員,請使用 ALTER ROL ...
  • 一、安裝資料庫相關軟體 sql server management studio是管理sql server資料庫的軟體,想要使用需到微軟官網下載安裝sql server,然後再安裝sql server management studio。微軟下載地址https://www.microsoft.com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...