爲何要多看書呢?設計模式
在技術類書籍上,看書的目的,不是爲了記住全部的技術,而是爲了積累相關的技術,在須要用到時可以信手拈來。安全
好比,最近看了唐巧的《iOS開發進階》,嚴格意義上來講,這本讀物,是做者在其博客文章的基礎上,集合而成的,是對其發表的文章一個綜合。網絡
因此,整本書,各章節之間,不會有太多的聯繫,勉強只能算是對iOS開發知識,某些比較重要的知識點的分門別類,論述了某個知識點的進階應用,卻忽略了知識點之間的關聯,也沒有對這些知識點的綜合應用。閉包
某種意義上來講,能夠把這本書看成是手冊類的技術查詢書,而非iOS開發的綜合應用。函數
與其說是開發進階,我反倒以爲這本書的內容,更適合入門初學者或者經驗尚不是太足的開發者。而對於經驗較豐富的開發人員,此書可做爲知識盲點的補充讀物。工具
以上,是我的對本書定位的一些見解,各花入各眼,不喜勿噴。對於想入手此書的開發者,也可做爲參考。性能
說完了書的定位,對本書某些值得單獨拿出來談談的某些內容,就在這裏開始展開吧。學習
此書對技術細節的把握,仍是值得看的,對於開發基礎的夯實,有必定的做用。好比內存管理,CoreText排版引擎,以及第三方工具好比Charles、Reveal的使用等知識點,可深刻細看。開發工具
全書分爲三個部分,分別來講下。優化
引言裏,主要講述了提升開發技能的一些途徑。
相信這是最簡單易行的學習方式,利用碎片化的時間,但也須要更高的專一力,由於碎片化的閱讀,容易被分散注意力,並且閱讀範圍的擴散會無節制。
好比,博客文章裏有其它連接 ,跳轉連接後,第二篇文章又包括其它連接,這就容易致使有限的時間內,看不完想要看的文章。
最簡單的解決辦法就是,不點擊文章裏的連接,看完後再發散思惟,去看其它連接文章。
這不就是我寫這篇文章的目的嗎。讀書,有利於全面、系統地學習知識。
這個是最全面,最權威的學習方式,但相對來講,也比較枯燥。全部的iOS開發技術,都能在這裏學習到。
說到這裏,聯想到第二點提到的讀書,其實如今市面上的大部分入門級書籍,大部份內容都是對蘋果官方API的介紹和應用。因此某種意義上來講,看書也顯得不是很必要。
我我的以爲,這是開發進階的必要手段。對設計模式、編碼規範、基礎知識,這些方面的提升都會有極大的幫助。
分享了一些經常使用、實用的開發工具。
可是,書中說起的移動統計工具Flurry、崩潰日誌記錄工具Crashlytics、App Store統計工具App Annie,這些工具可能有其它更好的替代者,相對來講,也顯得過期。
最後說起的Xcode插件,因爲目前Xcode已經不支持插件,所以也就成了雞肋。
因此,如今來看,如下三個工具,我的以爲是比較實用的。
主要用來管理第三方庫,固然,也能夠將本身項目的組件提取出來成爲庫,而後使用Cocoapods來進行管理。
著名的網絡抓包工具,主要用於控制網絡流量、抓取網絡請求以及響應,以及其它一些功能。
這個界面調試工具,相信你們也不陌生。可是,隨着Xcode對自身集成的界面調試工具的不斷優化,第三方工具Reveal的使用可能會愈來愈少。固然,Reveal會有更強大的功能,包括不編譯調試UI等功能,仍是比較實用的。
本章講述的內容,本應該是做爲壓軸大戲的,但最後看完,卻大部分僅僅是對於一些基本知識的介紹而已。這類實踐,讀者也能夠經過閱讀蘋果官方文檔,來得到。
下面將書中的兩點比較有價值的知識點,拿出來分享一下。
如今的開發者,可能大可能是使用ARC來讓系統自動管理內存,因此關於引用計數的知識,可能相對來講比較欠缺。
接觸最多的內存管理問題,可能集中在對象的循環引用問題上。書中詳細描述了引用計數的原理,也討論了循環引用問題產生的緣由以及解決方案。
還有另一個問題,就是Core Foundation對象的內存管理,沒法使用ARC,須要開發者手動管理內存。
能夠說,這個章節,是此書比較有價值的內容所在。
書中說起,使用CoreText技術,能夠對於富文本進行復雜的排版,還能夠實現對於圖片、連接的點擊效果。文章結合大量的實例,進行詳細介紹。
優勢是,相對於UIWebView,內存佔用少,能夠在後臺渲染,能夠作更好的原生交互效果,交互效果能夠更加細膩。
缺點是,渲染出來的內容,不能方便地支持內容的複製。須要本身處理不少複雜邏輯,好比連接點擊效果。
講述了App Store審覈,一些開發、調試技巧,提升開發效率的技巧等等。能夠有選擇性的看。
本部分講解了iOS開發涉及的底層原理,經過了解語言實現細節,將加深對於語言的理解,從而能更加深刻地理解語言背後的本質。
主要涉及如下三部份內容。
經過了解Objective-C對象模型,來理解iOS如何支持KVO、Method Swizzling、block等特性。
此章節介紹的一些API,做者聲明,不會被App Store審覈時拒絕,是安全的。
Tagged Pointer對象,可能相對來講比較陌生。這是蘋果在2013年,爲了節省內存和提升執行效率,在64位程序上,引入的概念。引入後,相關邏輯能減小一半的內存佔用,並有3倍的訪問速度提高,以及100倍的建立、銷燬速度提高。
Tagged Pointer經過在其最後一個bit位設置一個特殊標記,用於將數據直接保存在指針自己中。專門用來存儲小的對象,例如NSNumber和NSDate。
對於64位設備,蘋果除了引入Tagged Pointer來優化小的對象外,對於普通的對象,其isa指針也進行了優化和調整。
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一共有三種類型,每種類型都有對應的類,上述中isa指針就是指向這個類。
_NSConcreteGlobalBlock:全局的靜態block,不會訪問任何外部變量,不會涉及到任何拷貝,好比一個空的block
_NSConcreteStackBlock:保存在棧中的block,當函數返回時被銷燬。
_NSConcreteMallocBlock:保存在堆中的block,當引用計數爲0時被銷燬。該類型的block都是由_NSConcreteStackBlock類型的block從棧中複製到堆中造成的。
因爲block會引用外部的變量,比較容易形成循環引用。對於這種問題,須要將引用的一方變成weak的,從而避免循環引用。
好了,全書的分享到此結束,但願可以幫助到你們。
雖然書中部份內容有些過期,或者離進階有一段距離,但也不乏值得借鑑的內容。整體上,能夠做爲基礎參考讀物,但若是真的要學習進階內容,建議不要抱太大指望。
以上,是個人我的見解,仍是那句,不喜勿噴哈。
最後,推薦一本真正進階的讀物,《高性能iOS應用開發》,貌似是近一兩年纔出版的,值得看。