1. 程式人生 > >[iOS進階]探索iOS開發中各種機制

[iOS進階]探索iOS開發中各種機制

1、快取機制

iOS快取機制主要包括按需快取和預快取兩種,一般常用的時按需快取,只有當應用需要實現使用者對離線資料也能處理的時候才需要預快取。

按需快取又分為URL快取和資料模型快取模式,資料模型快取可以採用NSKeyedArchive和NSKeyedUnarchive來實現,需要遵循NSCoding協議,如SDWebImage就是用來處理imge快取的第三方庫。如果遵循HTTP1.1 協議的快取規範,那麼可以用URL快取,AFNetworking提供了對HTTP1.1 快取規範的原生支援。

另外預快取一般可以用Core Date實現,儘量避免使用SQList,除非資料庫需要跨平臺使用。

2、推送機制

兩張圖搞定訊息推送機制:

圖一

圖一中描述了訊息推送的完整過程

  1. 應用程式向iOS註冊訊息推送
  2. iOS從APNS Server獲取device token,應用程式接收device token
  3. 應用程式將device token傳送給PUSH伺服器端程式
  4. 服務端程式向APNS服務傳送訊息
  5. APNS服務將訊息傳送給iPhone應用程式

無論是iPhone客戶端和APNS,還是Provider和APNS1,都需要通過證書進行連線

圖二

圖二中描述了推送的過程:

  • 第一階段:應用程式把要傳送的訊息、目的iPhone的標識打包,發給APNS。 (保留了device token)

  • 第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查詢有相應標識的iPhone,並把訊息傳送到iPhone。

  • 第三階段:iPhone把發來的訊息傳遞給相應的應用程式,並且按照設定彈出Push通知。(始終會推送,彈出與否看是否開啟推送)

3、訊息機制/執行時機制

iOS訊息機制與C++中得虛擬函式很相像,都是執行時繫結,而且傳遞的方向也是由子類到父類。
iOS訊息機制分為兩個過程,訊息傳遞和訊息轉發,訊息傳遞的方向是子類到父類,訊息傳遞的過程是對類的methodList進行搜尋,試圖找到能夠處理訊息的方法。如果訊息傳遞處理不了,那麼就進行訊息轉發。

  • 訊息轉發過程首先會問所屬類是否有@dynamic方法能夠處理該訊息
  • 沒有的話就接著詢問所屬類內部的物件是否能夠處理該訊息
  • 沒有的話就將該訊息的所有資訊打包為NSInvocation物件,啟動完整的訊息轉發機制,看看所屬類以及父類能夠處理該訊息
  • 沒有的話就直接呼叫“doesNotRecognizeSelector:”方法丟擲異常,表示訊息無法處理

整個過程會建立一個“快速對映表”,以提高效率。

4、事件機制

iOS事件機制主要包括響應者鏈和事件分發兩個要點,事件分發的目的是為了找到第一響應者,事件分發的過程構成了一條響應者鏈。

5、反射機制

反射機制,即通過類名來生成相應類的例項或者獲取已知例項的相關資訊。
在iOS中,反射機制包括:

  • 通過NSObject中定義的方法:
id class = [[array objectAtIndex:0] class];

NSArray array = [[NSArray alloc] init];
[array isKindOfClass:NSObject];
[array isMemberOfClass:NSObject];

[array responseToSelector:@(objectAtIndex)];
  • 直接呼叫執行時函式進行動態程式設計
    詳見文章連結1

6、後臺執行機制

  • iOS後臺執行機制(偽後臺)
    1. 程式進入後臺後,有5s-10m的執行緩衝時間,之後系統會終止該程式執行,記憶體中還存有應用程式的相關資訊。如果記憶體不足會將程式掛起,釋放記憶體。
    2. 按兩下HOME鍵後,顯示的知識[最近用過的應用程式],相當於瀏覽器的瀏覽記錄。
    3. 也有一些例外的程式是容許在後臺中持續執行的,如後臺播放音樂、GPS程式、VOIP程式、Newsstand以及周邊配件附屬的程式。
    4. 推送機制經過APNS傳送到手機
  • windows phone系列後臺執行機制(偽後臺)
    1. 其實與iOS相近似,後臺共有live agent(實時後臺)(限制數量)、凍結(超過數量的任務的狀態)、墓碑狀態(記憶體吃緊進入的狀態)、關閉(記憶體完全不夠時進入的狀態)四種情況。
    2. 系統允許程式將自己鎖定在實時後臺和凍結兩種狀態,不會被墓碑,但是也是有限制的。
    3. 推送機制不如iOS
  • android後臺執行機制(真後臺)
    1. 使用者離開應用程式時,他的程序在後臺被保留下載,而是被會根據需要,而允許它在需要的時候繼續執行(比如下載web介面),並且在使用者返回時回到前臺
    2. 如果應用存在於另外一種服務模式,則即使殺了後臺也仍然可以存在於服務中,除非機子root過了。
      PS:windows電腦系統多工管理和android多工管理近似,後臺任務“正在執行”,不表示程序正在佔用CPU,因此可見雖然開了很多程序,但是CPU佔有率不高,記憶體佔有率還是很高的。

7、沙盒機制

iOS應用程式只能在為該改程式建立的檔案系統中讀取檔案,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非程式碼檔案都要儲存在此,例如影象,圖示,聲音,映像,屬性列表,文字檔案等。

  1. 每個應用程式都有自己的儲存空間

  2. 應用程式不能翻過自己的圍牆去訪問別的儲存空間的內容

  3. 應用程式請求的資料都要通過許可權檢測,假如不符合條件的話,不會被放行。

通過這張圖只能從表層上理解sandbox是一種安全體系,應用程式的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程式執行各種操作的許可權限制。

8、記憶體管理機制

對C++程式設計師來說,使用指標最蛋疼的就是記憶體管理,為了避免捲進繁瑣的管理記憶體保證不會記憶體洩露,我通常儘量不使用指標。但是在objective-c中,所有的變數都是指標,那麼你就不得不考慮下如何管理記憶體了。

iOS記憶體管理從手動引用計數演變到自動引用計數,本質上是沒有變得,只不過編譯器幫忙添加了部分release、retain程式碼,減少了程式設計師的負擔,提高了程式碼的安全性。

9、複用機制

  1. Provider是指某個iPhone軟體的Push伺服器,APNS是Apple Push Notification Service的縮寫,是蘋果的伺服器。