從事iOS開發兩年,讀《iOS開發進階》後的感悟,以及給大家帶來的福利

本人從事iOS開發已有兩年時間,最近辭職在家,除了陪家人,更多是學習iOS進階課程,同時也看了唐巧的《iOS開發進階》,下面是我的一點感悟,如有不對,請多包涵。

開始說書

嚴格意義上,唐巧的《iOS開發進階》,應該是對作者博客的內容的彙總,所以,整本書在章節與章節之間,聯繫性不是十分強,個人認爲,此書更加適合作爲手冊式的技術查詢書,但總的來講,這本確實比較適合初學者或者是經驗並不是十分豐富的開發者,而對於經驗比較豐富的iOS開發人員,也可以用來鞏固知識點。

一、引言部分

講述了提高iOS開發技能的一些途徑

如何提高iOS開發技能

1、閱讀博客

這個不需要講,是很簡單的學習方式,就看自己願不願意執行

2、讀書

有利於全面、系統的學習知識

3、看蘋果的官方文檔

這個是iOS開發者必須要學會的學習方式,所有的iOS開發技術都可以在這裏學習到。

4、最好的學習就是實戰,懂得去看一些開源項目代碼,對於設計模式、編碼規範、基礎知識等方面的提高都會有極大的幫助。

二、分享了一些iOS開發工具

書中分享了一些常用、實用的開發工具,個人覺得比較實用的有三個,如使用Cocoapods做依賴管理、網絡封包分析工具Charles、界面調試工具Reveal

三、iOS開發實踐

本章講述的內容,本應該是作爲壓軸大戲的,但最後看完,卻大部分僅僅是對於一些基本知識的介紹而已。這類實踐,讀者也可以通過閱讀蘋果官方文檔,來獲得。

下面將書中的兩點比較有價值的知識點,拿出來分享一下。

1、內存管理

現在的開發者,可能大多是使用ARC來讓系統自動管理內存,所以關於引用計數的知識,可能相對來說比較欠缺。

接觸最多的內存管理問題,可能集中在對象的循環引用問題上。書中詳細描述了引用計數的原理,也討論了循環引用問題產生的原因以及解決方案。

還有另外一個問題,就是Core Foundation對象的內存管理,無法使用ARC,需要開發者手動管理內存。

2、CoreText排版引擎

可以說,這個章節,是此書比較有價值的內容所在。

書中提及,使用CoreText技術,可以對於富文本進行復雜的排版,還可以實現對於圖片、鏈接的點擊效果。文章結合大量的實例,進行詳細介紹。

優點是,相對於UIWebView,內存佔用少,可以在後臺渲染,可以做更好的原生交互效果,交互效果可以更加細膩。

缺點是,渲染出來的內容,不能方便地支持內容的複製。需要自己處理很多複雜邏輯,比如鏈接點擊效果。

3、其它實戰技巧

講述了App Store審覈,一些開發、調試技巧,提高開發效率的技巧等等。可以有選擇性的看。

四、iOS開發底層原理

本部分講解了iOS開發涉及的底層原理,通過了解語言實現細節,將加深對於語言的理解,從而能更加深入地理解語言背後的本質。

主要涉及以下三部分內容。

1、Objective-C對象模型

通過了解Objective-C對象模型,來理解iOS如何支持KVO、Method Swizzling、block等特性。

此章節介紹的一些API,作者聲明,不會被App Store審覈時拒絕,是安全的。
Tagged Pointer對象

Tagged Pointer對象,可能相對來說比較陌生。這是蘋果在2013年,爲了節省內存和提高執行效率,在64位程序上,引入的概念。引入後,相關邏輯能減少一半的內存佔用,並有3倍的訪問速度提升,以及100倍的創建、銷燬速度提升。

Tagged Pointer通過在其最後一個bit位設置一個特殊標記,用於將數據直接保存在指針本身中。專門用來存儲小的對象,例如NSNumber和NSDate。

對於64位設備,蘋果除了引入Tagged Pointer來優化小的對象外,對於普通的對象,其isa指針也進行了優化和調整。

block對象模型

block的結構體定義

struct Block_descriptor {
    unsigned long int reserved;
    unsigned long int size;
    void (*copy)(void *dst, void *src);
    void (*dispose)(void *);
};
struct Block_layout {
    void *isa;
    int flags;
    int reserved;
    void (*invoke)(void *, ...);
    struct Block_descriptor *descriptor;
    /* Imported variables. */
};

從上面代碼看出,Block_layout就是對block結構體的定義:

isa指針:指向表明該block類型的類。

flags:按bit位表示一些block的附加信息,比如判斷block類型、判斷block引用計數、判斷block是否需要執行輔助函數等。

reserved:保留變量。

invoke:函數指針,指向具體的block實現的函數調用地址。

descriptor:block的附加描述信息,比如保留變量數、block的大小、進行copy或dispose的輔助函數指針。

variables:因爲block有閉包性,所以可以訪問block外部的局部變量。這些variables就是複製到結構體中的外部局部變量或變量的地址。

block的類型

block一共有三種類型,每種類型都有對應的類,上述中isa指針就是指向這個類。

_NSConcreteGlobalBlock:全局的靜態block,不會訪問任何外部變量,不會涉及到任何拷貝,比如一個空的block

_NSConcreteStackBlock:保存在棧中的block,當函數返回時被銷燬。

_NSConcreteMallocBlock:保存在堆中的block,當引用計數爲0時被銷燬。該類型的block都是由_NSConcreteStackBlock類型的block從棧中複製到堆中形成的。

block使用的注意事項

由於block會引用外部的變量,比較容易造成循環引用。對於這種問題,需要將引用的一方變成weak的,從而避免循環引用。

總結

好了,全書的分享到此結束,希望能夠幫助到大家。

雖然書中部分內容有些過時,或者離進階有一段距離,但也不乏值得借鑑的內容。總體上,可以作爲基礎參考讀物,但如果真的要學習進階內容,建議不要抱太大期望。

福利

有關於iOS的直播架構、編程思想、網絡框架、GCD、Block、架構模式、性能優化、Runtime、Socket、核心動畫底層原理分析、硬編碼-視頻H264編碼、底層圖形渲染、KVO、逆向等...公開課視頻以及資料可以加這位×××姐微信:logic_yan ,備註全網程序猿,即可免費領取!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章