(轉載)學習唐巧的《iOS開發進階》

作者Molary已關注

2016.02.28 16:51*字數 4334閱讀 1109評論 1喜歡 10

(一)推薦的圖書

1.書里推薦的圖書:

Object-c程序設計

swift快速入門

跨越終端web

iOS測試指南

(二)推薦的博客和如何更好的學習iOS開發

1.提高iOS開發技能

1)閱讀博客

好的博客列表:https://github.com/tangqiaoboy/iOSBlogCN

2)讀書

每年至少堅持讀完一本高質量的iOS開發圖書

3)看WWDC視頻

4)看蘋果的官方文檔

5)看開源項目的代碼

除iOS開發本身知識外,還可以學習設計模式和軟件架構等

6)多寫代碼多思考

盡量保持寫的代碼都具有復用性。代碼因為業務需求需要變更時,及時重構,在不要留下技術債的同時,多思考如何設計應用結構,保證滿足靈活多變的產品需求,在多次重構和思考中,會慢慢積出一系列的最佳解決辦法,成為自己的寶貴經驗。

7)多和同行交流

國內的技術社區進行交流,國外的Stack Overflow(http://www.stackoverflow.com)上提問或者回答問題。

8)分享

分享方式:發起一個開源項目,寫技術博客,在技術會議上做報告。

(三)摘要:iOS開發工具

1.CocoaPods

CocoaPods項目的源碼地址:https://github.com/CocoaPods/CocoaPods

可以節省設置和更新第三方開源庫的時間。

使用CocoaPods將用到的第三方庫放到profile的文件中,執行pod install。會自動下載下來

注意事項:

1)關于.gitigonre

profile.lock只有在執行pod update才會變更,執行pod install不會改變,不能把profile.lock添加到.gitigonre中。

2)為自己項目創建podspec文件

參考:兩篇博文:《如何編寫一個CocoaPods的spec文件》(http://ishalou.com/blog/2012/10/16/how-to-create-a-cocoapods-spec-file/)和《cocoapods入門》(http://studentdeng.github.io/blog/2013/09/13/cocoapods-tutorial/)

3)使用私有的pods,不更新podspec

2.網絡封包分的截取和分析工具Charles

方便開發中截取調試網絡請求內容,分析封包協議,以及模擬慢網速等。

官方網址:http://www.charlesproxy.com

1)可以模擬慢網速

2)截取SSL信息

3)修改網絡請求內容

4)修改服務器返回內容

5)Map功能 Map Remote網絡請求重新定義到另一個網址,Map Local網絡請求重新定義到本地文件。

6)Rewrite對網絡請求的結果進行改變

7)Breakpoints功能

3.Reveal

開發時可以動態的查看和修改程序的界面,可以連接真機和模擬器

PonyDebugger和Spark Inspector也是同沒醒的界面調試工具,PonyDebugger開源并且免費,Reveal和Spark Inspector是收費的,不過功能更強大些

4.移動統計工具Flurry

https://github.com/tangqiaoboy/FlurryUsageSample

1)每天登錄用戶數,應用使用次數;

2)使用iOS系統各版本(例如iOS6.0,iOS7.0等)比例。

3)使用iOS各種設備(例如iphone4,iphone5等)比例。

4)crashlog統計

5.崩潰日志記錄工具Crashlytics

專門為移動應用開發者提供的保存和分析應用崩潰信息的專業工具。

6.App Store統計工具App Annie

App Store數據的統計分析工具,該工具可以統計App在App Store的下載量,排名變化,銷售收入情況及用戶評價等信息。

7.Xcode插件

1)Alcatraz管理Xcode插件,http://blog.csdn.net/xiaoliuxingzi/article/details/46889429。

2)KSimageNamed ?彈出圖片

3)XVim 編輯窗口打開Vim Ctrl+W來切換當前編輯的分欄

4)FuzzyAutocompletePlugin 使用模糊的方式自動補全代碼

5)XToDo 提供一個匯總的界面,集中顯示所有的未完成的TODO和FIXME標記

6)BBUDebuggerTuckAway 編輯代碼的時候自動隱藏底部的調試窗口

7)SCXcodeswitchExpander 迅速的在switch語句中填充枚舉類型的每種可能的取值

8)deriveddata-exterminator清除Xcode緩存目錄的插件

9)VVDocumenter自動生成代碼注釋的工具

10)ClangFormat自動調整代碼風格的工具

11)ColorSense實時預覽相應的顏色

12)XcodeBoost 包含多個輔助修改小代碼的功能

9.其它工具介紹

1)取色工具,數碼測色計(DigitalColor Meter),蘋果自帶的類似有xScope

2)圖形工具ImageOptim免費圖像壓縮工具,iOS工程默認使用pngcrush來壓縮圖片,效率不高,

3)馬克鰻 免費標注工具,可以方便地在輸出的美術設計稿上標注相應界面元素的大小,顏色,邊距,說明等。

4)Dash 快速查看API文檔和代碼片段管理工具。

5)蒲公英,內測分發工具類似于TestFlight.

6)命令行工具,nomad方便操作蘋果開發者中心的命令行工具,添加測試設備,更新證書,增加AppID,驗證IAP的憑證。

7)xctool 可在github上下載,開源的iOS編譯和測試的工具,可方便進行編輯和單元測試,將測試的結果集成到Jenkins中,實現自動化集成,蘋果在OSX Server上推出自動化集成BOT,效果不是很好。

8)appledoc是一個從源代碼中抽取文檔的工具,可從iOS工程的源代碼中抽取相應的注釋,生成幫助文檔。

(四)有用的技術

1.內存管理,引用計數。

Xcode檢測循環引用,使用Xcode的菜單欄選擇Product - Profile - Leaks,在單擊右下角的Profile按鈕開始檢測,在Instruments會檢測到這次的循環引用,Instruments中會用一條紅色的線條來表示一次內存泄露的產生,切換到Leaks這一欄,點擊Cycles&Roots,就可以看到以圖形的方式顯示出來的循環引用,這樣我們就可以非常方便地找到循環引用的對象了。

ARC

需要使用_bridge等關鍵字

將非ARC的工程轉換成ARC,Xcode中使用Edit-Refactor-Convert to Object-c ARC

2.CoreFoundation對象的內存管理

底層的內存管理XXCreateWithXxx這樣的方式創建,底層的內存管理。

3.GCD

4.UIWindowLevel

UIKIT_EXTERN const UIWindowLevel UIwindowLevelNormal;

切換到用戶的界面的時候需要輸入密碼,有隨書的筆記。需要用到UIWindow的情況有應用啟動頁,應用內通知提醒,輸入密碼。

5.動態下載系統提供的多種中文字體

蘋果提供啦動態下載代碼的Demo工程:http://developer.apple.com/library/ios/#samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html

6.使用應用內支付

1)配置后臺

2)配置iTunes Connect

3)iOS端的開發

4)服務器端開發

5)蘋果審核應用時,只會在沙盒(sandbox)環境購買,其產生的購買憑證,也只能連接蘋果的測試驗證服務器,但是審核的應用又是連接的我們的線上服務器,那應該怎么處理?

解決辦法是判斷蘋果正式驗證服務器的返回狀態碼,如果是21007,則再一次連接測試服務器進行驗證即可,蘋果的文檔http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions

7.基于UIWebView的混合編程

1)模板引擎:MGTemplateEngine,也可以使用GRMustache,

2)Object-c和JavaScript語言的相互調用

原生界面發現以gap請求的地址,就不進行加載,而是執行相應的調用邏輯。這也是Cordova框架調用的原生邏輯機制,

WebViewJavaScriptBridge它能實現相互調用

3)CommonJS規范

4)使用safari進行調試

safari的調試模式打開,safari-preferences-Advanced 勾選上Show Develop menu in menu bar選項

在Iphone模擬器或者真機的設置上把調試模式打開,safari-高級-web檢查器

通過USB臉上電腦,safari的Develop菜單下就會多出相應的菜單選項

8.安全性問題

1)安全的傳輸密碼,將密碼加密MD5

2)charles將自己的電腦設置成代理服務器,windows環境下使用Fiddler軟件,

使用get方式發送密碼很不安全,get的URL數據一般都會保存在服務器的access log中,所以黑客一旦攻擊啦服務器,只需要掃描access log,則可以輕易獲得所有用戶的明文密碼

3)防止通訊協議被輕易破解

通訊協議被破解,開發者可以選擇類似Protobuf,Goole提供的一個開源數據交換格式,對于傳輸的內容進行一定程度的加密,一增加黑客破解協議的難度。

4)本地文件和數據安全

javaScript的安裝包解壓可以看到源代碼,要對javaScript進行混淆和加密,防止被篡改。

本地數據應該加密存儲或者將其保存到keychain中,以保證其不被篡改。

5)通過file,class-dump,theos,otool等工具,黑客就可以分析編譯之后的二進制程序文件,IDA是一個收費的反匯編工具,可以采取的措施是,關鍵邏輯使用純C實現。

9。基于CoreText排版引擎

CoreText是一個處理文字和字體的底層技術,Quartz是一個2D圖形渲染引擎。

使用CoreText排版的是,例如:新浪微博客戶端,多看閱讀客戶端,猿題庫都是基于CoreText來排版的,用drawRect方法,就是畫圖。

復雜的排版引擎分為4類

1)一個是顯示用的類,僅負責顯示內容,不負責排版;

2)一個模型類,用于承載顯示所需要的所有數據

3)一個排版類,用于實現文字內容的排版;

4) 一個配置類,用于實現一些排版時的可配置項。

分成如下:

1)CTFrameParserConfig類,用于配置繪制的參數,例如文字顏色,大小,行間距等

2)CTFrameParser類,用于生成最后回執界面需要的CTFrameRef;

3) CoreTextData類,用于保存由CTFrameParser類生成的CTFrameRef實例,以及CTFrame實際回執需要的高度;

4)CTDisplayView類,持有CoreTextData類的實例,負責將CTFrameRef繪制到界面上

注意:修改CTView的frame信息,需要把use Autolayout的勾選去掉。

(五)實戰技巧

1.撤銷正在審核的應用;

點擊Reject this binary

2.申請加急審核

1)點擊Contact us;

2)APP Review;

3)request Expedited review

5) request an expedited app review可加急審核應用。

3.刪除設備

每年只有一次機會,延續費用之后第一次登錄進去,membersship year開始后即可使用,需要先刪除設備,才能新加設備,一旦開始添加,刪除不管用。給蘋果發郵件,http://developer.apple.com/contact/點擊"program benefits"按鈕提交,

4)把應用下架

應用上架時間改變

5)收鍵盤

[self.view endEditing:YES];

[[UIApplication sharedApplication]sendAction:@selector(resignFirstResponder) to:nil for:nil forEvent:nil];

[[UIApplication sharedApplication]endEditing:YES];

6.NSJSONSerialization比NSKeyedArchiver更好在選擇持久化方案,快啦7倍

7.修改長按后的中文變英文問題:

用vim打開info.plist,在文件中增加CFBundleLocalizations zh_CN en

8.調用系統方法實現截屏,實現半透明效果

9.內存優化CABackingStore,volatile表示,這塊內存可能再次被原變量使用。

10類方法的block不會產生循環引用問題。

11Xcode的快捷鍵,Behaviors 設置各種行為發生界面應該做何種改變。

12,JavaScript文件設置調整

js后綴的文件默認被拖動到工程中后,是在編譯列表,而不是在資源列表。需要手工調整其位置,否則就不能導報到ipa文件中,js不需要編譯,需要手工將這個js文件從compile Source移動到copy Bundle Resources.

13.清除DerivedData

緩存路徑 ~/Library/Developer/Xcode/DerivedData

工程進行git merge 或者git rebase的時候造成緩存異常。清除緩存后重啟Xcode就可以啦

14.target信息異常

編譯target異常的時候,可刪除UourProjectName.xcodeproj/xcuserdata目錄,該目錄下有當前用戶的各種工程狀態信息,刪除后重啟Xcode,信息會自動重建。

15.下載Xcode https://developer.apple.com/downloads/index.action

16.調劑技巧

1)Opt+Shift可以調出雙指拖動效果

2)Opt 可以在模擬器中調出雙指放大和縮小效果

3)Shift + cmd + H到Home鍵

4)Cmd + Left/Right 切換橫豎屏

17.xib刪除后,并不會立馬刪除,需要刪除應用后重新啟動。

18.圖片可以直接從Finder拖到模擬器中

19.真機模擬慢網速 :設置-開發者-Status-Network Link Conditioner 中,如果在真機中沒有找到,在電腦的Xcode的Origanizer將其設置成測試設備

20.ipa文件格式

把ipa文件名的后綴改成zip,然后雙擊及可解壓打開,解壓后再程序的Payload目錄下,是一個app后綴的文件夾,在該文件上單擊右鍵選擇show Package Contents 即可看到所有的程序資源文件。

21.查看ipa的圖片

用命令來解壓圖片pngcrush -revert -iphone -optimizations 源文件名 目的文件名

22.為項目增加Daily Build

1)保證每天提交代碼的可用性

2)進度跟進,產品可以跟進進度,產品經理更多時間來調整他的設計。

3)確認需求,產品經理可以盡早確認開發的功能細節是否符合預期。

4)測試跟進,測試人員可以盡早進行測試。

Xcode提供啦build命令,用xcodebuild -usage可以查看到所有的可用參數。

在Daily Build中,把Release用為Configuration其實不是很好。因為Release證書可能經常會被修改。我們可以基于Release的Configuration。在Info一欄,在Configuration一欄的下方點擊+,然后選擇Duplicate Release Configuration,新建名為DailyBuild的Configuration.

用xcodebuild -configuration DailyBuild -target "YourProduct"

在bulid里面就會出現一個.app文件啦。這個就是build成功之后的程序文件。

23.生成安裝包

使用item-services協議來直接在iphone/ipad上安裝應用程序。

24。找不到開發證書。

把開發者證書從登陸拖動到系統欄中

25.可安裝腳本自動執行Daily build ,可以參考自動打包腳本ios-makefile 網址https://github.com/lexrus/ios-makefile。

26.用腳本自動生成小尺寸的圖片

1)第三方軟件XnConvert

2)安裝imagemagick,先用brew install ?imagemagick

27.檢查圖片尺寸是否都是偶數

28.代碼片段管理

通過快捷鍵Cmd + Ctrl+Opt + 2調出來。

29.定義自己的代碼片段

1)使用git管理代碼片段,將自己整理的代碼片段都放到Git上,

(六)底層原理

1.isa指針

2.Ruby語言

3.系統相關的API及應用

1)isa swizzling的應用

系統提供的KVO的實現,就利用啦動態地修改isa指針的值的技術。

2)Method Swizzling API說明

特定版本有問題的系統庫函數打了Patch.

3)Nimbus工具類庫

4)大眾點評,自己開發的基于Wax修改而來的WaxPatch,可以實現通過服務器更新來動態修改客戶端的邏輯,WaxPatch主要是修改了Wax中的wax_instance.m文件在其中加入了class_replaceMethod來替換原始實現,從而修改客戶端的原有行為。

4.Tagged Pointer對象

32位升級到64位,為了改進上面提到的內存占用和效率的問題,蘋果提出Tagged Pointer對象,WWDC2013年的視頻有介紹,

5.64位下的指針優化

32位環境下,對象的引用計數都保存在一個外部的表中,每一個對象的Retain操作,實際上都包括如下5個步驟

1)獲得全局的記錄引用計數的hash表

2)為了線程安全,給該hash表加鎖

3)查找到目標對象的引用計數值

4)將該引用計數值+1,寫會hash表

5)給該hash表解鎖

參考文獻:https://mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html

6.block對象模型

1)Block內部數據結構定義

https://llvm.org/svn/llvm-project/compiler-rt/tags/Apple/Libcompiler_rt-10/BlocksRuntime/Block_private.h

6層

1))isa指針,實現對象相關功能

flags,用于按bit位表示一些block的附加信息,

reserved,保留變量

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

descriptor,表示該block的附加描述信息,主要是size,copy,dispose函數的指針

variables,capture過來的變量,block能訪問它外部的局部變量,就是因為將這些變量(或變量的地址)復制到了結構體中

2)3種類型的Block

全局的靜態block,不會訪問任何外部變量;保存在棧中的block,當函數返回時會被銷毀;保存在堆中的block,當引用計數為0時會被銷毀。

3)用clang分析block實現

用clang工具可以將object-c 的源代碼改寫成c語言,clang -rewrite -objc block.c

7.參考文獻

1)https://llvm.org/svn/llvm-project/

2)http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/

3)http://rypress.com/tutorials/objective-c/blocks

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容