原文地址
iOS進階系列之基礎(chǔ)篇
概述
基礎(chǔ)篇包含的范圍較廣,是一個iOS開發(fā)者必須具備的知識从媚。包含了以下方面:OC逞泄、Swift 的語言特性、內(nèi)存管理機制拜效、持久化存儲喷众、網(wǎng)絡(luò)、渲染機制紧憾、多線程到千。
語言特性
維基百科中,這樣描述 OC 語言:
Objective-C是一種通用赴穗、高級憔四、面向?qū)ο蟮木幊陶Z言。它擴展了標(biāo)準(zhǔn)的ANSI C編程語言般眉,將Smalltalk式的消息傳遞機制加入到ANSI C中了赵。目前主要支持的編譯器有GCC和Clang(采用LLVM作為前端)。現(xiàn)在Objective-C與Swift是OS X和iOS操作系統(tǒng)甸赃、及與其相關(guān)的API柿汛、Cocoa和Cocoa Touch的主要編程語言。
- 消息傳遞是 OC 最大的特色埠对。運行時處理消息
- 協(xié)議是一組沒有實現(xiàn)的方法列表络断,任何的類均可采納協(xié)議并具體實現(xiàn)這組方法。
- 動態(tài)類型 id
- 轉(zhuǎn)發(fā)鸠窗,Objective-C允許對一個對象發(fā)送消息妓羊,不管它是否能夠響應(yīng)之。除了響應(yīng)或丟棄消息以外稍计,對象也可以將消息轉(zhuǎn)發(fā)到可以響應(yīng)該消息的對象躁绸。轉(zhuǎn)發(fā)可以用于簡化特定的設(shè)計模式,例如觀測器模式或代理模式臣嚣。
- Category, 分類中的方法是在運行時被加入類中的
-
import保證一個文件只會被包含一次
- 屬性
- NSEnumerator 快速枚舉
Swift 語言:
蘋果宣稱Swift的特點是:快速净刮、現(xiàn)代、安全硅则、互動淹父,而且明顯優(yōu)于Objective-C語言
- 關(guān)鍵字let var。Optional的本質(zhì)是 enum怎虫,有 None 和 Some 兩種類型暑认。
- 全面使用ARC困介,為了解決循環(huán)引用的問題,Swift提供unowned
- 無分號蘸际,不需要頭文件引入
- 泛型編程座哩,類型推斷
- 函數(shù)為一等類型,函數(shù)可以作為其他函數(shù)的參數(shù)或返回值
- 強類型
內(nèi)存管理機制
概述
軟件運行時會分配和使用設(shè)備的內(nèi)存資源粮彤,因此根穷,在軟件開發(fā)的過程中,需要進行內(nèi)存管理导坟,以保證高效屿良、快速的分配內(nèi)存,并且在適當(dāng)?shù)臅r候釋放和回收內(nèi)存資源惫周。其實尘惧,iOS的內(nèi)存管理和其它操作系統(tǒng)大同小異,首先闯两,iOS和其它系統(tǒng)一樣褥伴,內(nèi)存分頁,每頁4K漾狼。多個頁構(gòu)成一個region統(tǒng)一管理,負責(zé)管理的對象是VM object饥臂,其中包含了pager逊躁、size、resident pages等諸多屬性隅熙。不管是Objective-C的[NSObject alloc]稽煤,還是C代碼的對內(nèi)存分配,最終重任都會落到malloc庫上囚戚,釋放也是如此酵熙,最終都將使用malloc庫中的free()。
引用計數(shù)
iOS開發(fā)中驰坊,內(nèi)存中的對象主要有兩類匾二,一類是值類型,如int拳芙、float察藐、struct等基本數(shù)據(jù)類型,另一類是引用類型舟扎,也就是繼承自NSObject類的所有的OC對象分飞。前一種值類型不需要我們管理,后一種引用類型是需要我們管理內(nèi)存的睹限,一旦管理不好譬猫,后果嚴(yán)重讯檐。
值類型存在于棧中,引用類型存在于堆中染服,在棧中是連續(xù)的别洪,先進后出,效率較高肌索;在堆中會有內(nèi)存碎片蕉拢,可分配大塊內(nèi)存。在iOS開發(fā)過程中诚亚,棧內(nèi)存中的值類型系統(tǒng)會自動管理晕换,堆內(nèi)存中的引用類型是需要我們管理的。每個OC對象內(nèi)部都專門有四個字節(jié)來存儲引用計數(shù)器站宗,它是一個整數(shù)闸准,表示對象被引用的次數(shù),通過它可以判斷對象是否被回收梢灭,如果引用計數(shù)為0夷家,對象回收,不為0不回收敏释。當(dāng)對象執(zhí)行alloc库快、new或者retain時,引用計數(shù)加1钥顽,release時义屏,引用計數(shù)減1。
ARC
當(dāng)ARC開啟時蜂大,編譯器將自動在代碼合適的地方插入retain, release和autorelease
AutoreleasePool
App啟動后闽铐,蘋果在主線程 RunLoop 里注冊了兩個 Observer,其回調(diào)都是 _wrapRunLoopWithAutoreleasePoolHandler()奶浦。
第一個 Observer 監(jiān)視的事件是 Entry(即將進入Loop)兄墅,其回調(diào)內(nèi)會調(diào)用 _objc_autoreleasePoolPush() 創(chuàng)建自動釋放池。其 order 是-2147483647澳叉,優(yōu)先級最高隙咸,保證創(chuàng)建釋放池發(fā)生在其他所有回調(diào)之前。
第二個 Observer 監(jiān)視了兩個事件: BeforeWaiting(準(zhǔn)備進入休眠) 時調(diào)用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 釋放舊的池并創(chuàng)建新池耳高;Exit(即將退出Loop) 時調(diào)用 _objc_autoreleasePoolPop() 來釋放自動釋放池扎瓶。這個 Observer 的 order 是 2147483647,優(yōu)先級最低泌枪,保證其釋放池子發(fā)生在其他所有回調(diào)之后概荷。
在主線程執(zhí)行的代碼,通常是寫在諸如事件回調(diào)碌燕、Timer回調(diào)內(nèi)的误证。這些回調(diào)會被 RunLoop 創(chuàng)建好的 AutoreleasePool 環(huán)繞著继薛,所以不會出現(xiàn)內(nèi)存泄漏,開發(fā)者也不必顯示創(chuàng)建 Pool 了愈捅。
持久化存儲
sqlite遏考,Realm 數(shù)據(jù)庫,單文件 plist xml data 數(shù)據(jù)存儲蓝谨。對于緩存數(shù)據(jù)做好過期清理灌具。
網(wǎng)絡(luò)
了解http,https譬巫,處理 DNS 劫持咖楣,了解基于 TCP 及 UDP 的 socket 連接。
https
非對稱加密:RSA芦昔,ECC诱贿,DH
對稱加密:AES,DES咕缎,3DES珠十,IDEA,RC4
散列算法:MD5, SHA1凭豪,SHA256
TLS/SSL 握手過程:
- client send client_hello, 明文焙蹭,client支持的協(xié)議,加密算法嫂伞,隨機數(shù)(用于生成對稱密鑰)
- server send server+hello + server_certificate(含public_key) + server_hello_done.
- client check 服務(wù)端返回的證書鏈合法后壳嚎,client 用非對稱加密產(chǎn)生一個 key,pre_master_secret, 用公鑰加密后發(fā)送給 server末早。client 計算對稱加密密鑰:
master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)
[0..47];
encrypted_handshake_message,結(jié)合之前所有通信參數(shù)的 hash值與其它相關(guān)信息生成一段數(shù)據(jù)说庭,采用協(xié)商的對稱加密密鑰與協(xié)商的算法進行加密該段數(shù)據(jù)然磷,然后發(fā)送給服務(wù)器用于驗證協(xié)商的對稱加密密鑰是否正確, change_cipher_spec client 告知 server 后續(xù)采用對稱加密通信刊驴。
- server用私鑰解密第三個隨機數(shù)pre_master_secret姿搜,算出master_secret,用此密鑰解密encrypted_handshake_message捆憎,驗證對稱密鑰及協(xié)商的算法的正確性舅柜,驗證通過后,server 發(fā)送change_cipher_spec躲惰,告知客戶端后續(xù)采用對稱加密通信致份。server 同樣發(fā)送encrypted_handshake_message。
- 握手結(jié)束础拨,客戶端計算所有接收信息的hash 值H1氮块,并采用協(xié)商的對稱加密密鑰解密encrypted_handshake_message绍载,得到數(shù)據(jù)H2,對比H1和H2是否一致滔蝉,從而驗證協(xié)商的對稱加密密鑰和協(xié)商的算法的正確性击儡,驗證通過則握手完成,正式開始通過協(xié)商的對稱密鑰進行加密通信蝠引。
DNS 劫持
DNS 映射機制阳谍,DNS解析請求簡單來說,無非是輸入一個域名螃概,輸出一個ip地址矫夯。做自己的映射機制也就是客戶端本地維護這樣一個映射文件,只不過這個映射文件需要能從服務(wù)器更新谅年,還要做一些容錯處理茧痒。本地實現(xiàn)NSURLProtocol 對host進行ip映射。
Socket
Socket一般為長連接融蹂,連接長在旺订,保持好心跳,能隨時發(fā)送接收消息超燃,但連接長在會對電量消耗多区拳,有對實時性要求高的,如游戲必須用socket意乓。
渲染
渲染主要有文字和圖像樱调,文字上有 UIKit,CoreText届良。圖像渲染對解壓時機要把握好笆凌,平衡 CPU,GPU士葫,才能保證流暢性乞而,深入一點有圖層混合,圖層渲染慢显。這一遍文章對渲染講的很精辟iOS 保持界面流暢的技巧
多線程
多線程并發(fā)可能引發(fā):鎖競爭爪模,死鎖。
同步任務(wù):和使用的隊列無關(guān)荚藻,不會開啟子線程處理任務(wù)屋灌,會在當(dāng)前的線程中串行的調(diào)度任務(wù),即一個任務(wù)完成之后繼續(xù)下一個任務(wù)应狱,如果同步任務(wù)在主線程中調(diào)用共郭,會阻塞主線程
異步任務(wù):a. 使用串行隊列,會開啟一個子線程串行的調(diào)度任務(wù) b. 使用并行隊列,會開啟多個子線程并行的調(diào)度任務(wù)落塑,這種情況用的是最多的纽疟。
- iOS中的多線程技術(shù)主要有NSThread, GCD和NSOperation。他們的封裝層次依次遞增憾赁,其中
- NSThread封裝性最差污朽,最偏向于底層,主要基于thread使用
- GCD是基于C的API龙考,直接使用比較方便蟆肆,主要基于task使用
- NSOperation是基于GCD封裝的NSObject對象,對于復(fù)雜的多線程項目使用比較方便晦款,主要基于隊列使用.
Runloop的一篇文章:看 CFRunLoop源碼深入理解 RunLoop
原文地址