唐巧的《iOS開發進階》 - 讀後感

唐巧的《iOS開發進階》 - 讀後感

爲何要看書

爲何要多看書呢?設計模式

在技術類書籍上,看書的目的,不是爲了記住全部的技術,而是爲了積累相關的技術,在須要用到時可以信手拈來。安全

此書的定位

好比,最近看了唐巧的《iOS開發進階》,嚴格意義上來講,這本讀物,是做者在其博客文章的基礎上,集合而成的,是對其發表的文章一個綜合。網絡

因此,整本書,各章節之間,不會有太多的聯繫,勉強只能算是對iOS開發知識,某些比較重要的知識點的分門別類,論述了某個知識點的進階應用,卻忽略了知識點之間的關聯,也沒有對這些知識點的綜合應用。閉包

某種意義上來講,能夠把這本書看成是手冊類的技術查詢書,而非iOS開發的綜合應用。函數

與其說是開發進階,我反倒以爲這本書的內容,更適合入門初學者或者經驗尚不是太足的開發者。而對於經驗較豐富的開發人員,此書可做爲知識盲點的補充讀物。工具

以上,是我的對本書定位的一些見解,各花入各眼,不喜勿噴。對於想入手此書的開發者,也可做爲參考。性能

此書的精彩內容分享

說完了書的定位,對本書某些值得單獨拿出來談談的某些內容,就在這裏開始展開吧。學習

此書對技術細節的把握,仍是值得看的,對於開發基礎的夯實,有必定的做用。好比內存管理,CoreText排版引擎,以及第三方工具好比Charles、Reveal的使用等知識點,可深刻細看。開發工具

書的目錄結構

全書分爲三個部分,分別來講下。優化

引言

引言裏,主要講述了提升開發技能的一些途徑。

關於如何提升iOS開發技能

一、閱讀博客

相信這是最簡單易行的學習方式,利用碎片化的時間,但也須要更高的專一力,由於碎片化的閱讀,容易被分散注意力,並且閱讀範圍的擴散會無節制。

好比,博客文章裏有其它連接 ,跳轉連接後,第二篇文章又包括其它連接,這就容易致使有限的時間內,看不完想要看的文章。

最簡單的解決辦法就是,不點擊文章裏的連接,看完後再發散思惟,去看其它連接文章。

二、讀書

這不就是我寫這篇文章的目的嗎。讀書,有利於全面、系統地學習知識。

三、看蘋果的官方文檔

這個是最全面,最權威的學習方式,但相對來講,也比較枯燥。全部的iOS開發技術,都能在這裏學習到。

說到這裏,聯想到第二點提到的讀書,其實如今市面上的大部分入門級書籍,大部份內容都是對蘋果官方API的介紹和應用。因此某種意義上來講,看書也顯得不是很必要。

四、看開源項目的代碼

我我的以爲,這是開發進階的必要手段。對設計模式、編碼規範、基礎知識,這些方面的提升都會有極大的幫助。

1、iOS開發工具

分享了一些經常使用、實用的開發工具。

可是,書中說起的移動統計工具Flurry、崩潰日誌記錄工具Crashlytics、App Store統計工具App Annie,這些工具可能有其它更好的替代者,相對來講,也顯得過期。

最後說起的Xcode插件,因爲目前Xcode已經不支持插件,所以也就成了雞肋。

因此,如今來看,如下三個工具,我的以爲是比較實用的。

使用Cocoapods作依賴管理

主要用來管理第三方庫,固然,也能夠將本身項目的組件提取出來成爲庫,而後使用Cocoapods來進行管理。

網絡封包分析工具Charles

著名的網絡抓包工具,主要用於控制網絡流量、抓取網絡請求以及響應,以及其它一些功能。

界面調試工具Reveal

這個界面調試工具,相信你們也不陌生。可是,隨着Xcode對自身集成的界面調試工具的不斷優化,第三方工具Reveal的使用可能會愈來愈少。固然,Reveal會有更強大的功能,包括不編譯調試UI等功能,仍是比較實用的。

2、iOS開發實踐

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

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

內存管理

如今的開發者,可能大可能是使用ARC來讓系統自動管理內存,因此關於引用計數的知識,可能相對來講比較欠缺。

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

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

CoreText排版引擎

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

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

優勢是,相對於UIWebView,內存佔用少,能夠在後臺渲染,能夠作更好的原生交互效果,交互效果能夠更加細膩。

缺點是,渲染出來的內容,不能方便地支持內容的複製。須要本身處理不少複雜邏輯,好比連接點擊效果。

其它實戰技巧

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

3、iOS開發底層原理

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

主要涉及如下三部份內容。

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應用開發》,貌似是近一兩年纔出版的,值得看。

相關文章
相關標籤/搜索