iOS進階系列之基礎(chǔ)篇

原文地址
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 握手過程:

  1. client send client_hello, 明文焙蹭,client支持的協(xié)議,加密算法嫂伞,隨機數(shù)(用于生成對稱密鑰)
  2. server send server+hello + server_certificate(含public_key) + server_hello_done.
  3. 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ù)采用對稱加密通信刊驴。

  1. server用私鑰解密第三個隨機數(shù)pre_master_secret姿搜,算出master_secret,用此密鑰解密encrypted_handshake_message捆憎,驗證對稱密鑰及協(xié)商的算法的正確性舅柜,驗證通過后,server 發(fā)送change_cipher_spec躲惰,告知客戶端后續(xù)采用對稱加密通信致份。server 同樣發(fā)送encrypted_handshake_message。
  2. 握手結(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

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炎功,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缓溅,更是在濱河造成了極大的恐慌蛇损,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坛怪,死亡現(xiàn)場離奇詭異淤齐,居然都是意外死亡,警方通過查閱死者的電腦和手機袜匿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門更啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人居灯,你說我怎么就攤上這事祭务。” “怎么了怪嫌?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵义锥,是天一觀的道長。 經(jīng)常有香客問我岩灭,道長缨该,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任川背,我火速辦了婚禮,結(jié)果婚禮上蛤袒,老公的妹妹穿的比我還像新娘熄云。我一直安慰自己,他們只是感情好妙真,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布缴允。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪练般。 梳的紋絲不亂的頭發(fā)上矗漾,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音薄料,去河邊找鬼敞贡。 笑死,一個胖子當(dāng)著我的面吹牛摄职,可吹牛的內(nèi)容都是我干的誊役。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼谷市,長吁一口氣:“原來是場噩夢啊……” “哼蛔垢!你這毒婦竟也來了申尤?” 一聲冷哼從身側(cè)響起型型,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍睡,沒想到半個月后创泄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艺玲,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年验烧,在試婚紗的時候發(fā)現(xiàn)自己被綠了板驳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡碍拆,死狀恐怖若治,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情感混,我是刑警寧澤端幼,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站弧满,受9級特大地震影響婆跑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庭呜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一滑进、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧募谎,春花似錦扶关、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春铜异,著一層夾襖步出監(jiān)牢的瞬間哥倔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工揍庄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咆蒿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓币绩,卻偏偏與公主長得像蜡秽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缆镣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容