以前發過安卓那篇,如感興趣,戳個人名字看吧。html
去年購入mac開始學ios編程時用的是swift,今年用的是objective-c(下簡稱oc)。java
網上有將oc與java對比的博文,其實面向對象各類語言,能力大同小異,主要是寫法不一樣。oc最大的特殊,當爲用中括號調用方法,我感受這很醜陋怪異,但想到目的是讓每一個參數的意義在代碼中都直接呈現,除了用中括號也沒別的好辦法。android
屬性卻支持用點符號調用,看似直接向字段寫、賦值,實際調用的是getter/setter方法,就像jsp裏寫el表達式時某某點某某,實際調用的是getter。ios
之前看c代碼,最奇怪的是h文件和m文件的關係,以及引用的方式,不像java那樣一個public class聲明,互相import便可,認爲深奧玄妙,深不可識。其實只是固定寫法,h聲明一些公有方法,m實現這些方法,並能夠同時聲明一些私有方法,有點像java的接口聲明和實現類(xxImpl),但oc對應「接口」的概念是「協議」,用prototype聲明,確實,用「協議」更形象,它原本勒定的就是實現者的能力,像java聲明接口時常叫「xxAble」同樣。c++
其餘基礎語法不贅,跟java的功能相似,只是換了個外觀,參考《objective-c編程》《objective-c高級編程》《Effective objective-c》三本書就很好。比較引人注目的,是《objective-c高級編程》的三大主題,即「自動引用計數」「Blocks」和「GCD」這三大語法糖,大概對應java的內存回收中的引用計數知識、java使用匿名內部類實現回調函數、java尤爲是android編寫跨線程的代碼這三個主題,在後兩個方面,古老的java寫法確實略顯笨拙,oc的語法糖很方便。不過我比較土,java8至今還沒有研究過,不清楚其語法糖方便程度如何。(有空要研究下java八、scala、groovy這些聽說方便的概念)web
參考資料方面,因爲學會FQ時間較短,大部分時間用的主力參考書是手邊幾本紙書,某兩本翻譯的外國書被我塞到牀底下決定不看了,很是不滿意,《iOS開發指南》和《iOS9開發指南》這兩本人民郵電出版社的國產書我很喜歡。引進的翻譯書,有些做者「自我意識」太重,不願按知識體系,分層次地安排章節,而是按着本身一廂情願的「意識流」安排,強迫讀者跟着他的想法走,而他安排的順序,又不把體系結構、基礎知識、最核心經常使用技能放在重要位置,而是「反正個人書我說了算」,把些很邊緣的知識,在其基礎知識還沒有交待的狀況下就倉促提出,缺乏基礎知識根本看不懂,即便費力看懂了也沒太大用。我總在想,也許確實國人骨子裏懂老子「後其身而身先」的教誨,更懂得把本身擺在一個次要的位置,以閱讀者的大腦爲目標,把知識好好梳理安排,儘可能舒服地送進讀者的大腦去,這樣「知足了需求」,讀者喜歡,銷量天然好,「名」和「利」天然隨之而來。而不是存在感極強地勒令讀者跟着他走。不過話不能說絕,《iOS8應用開發入門經典》就至關不錯,以及我讀過的不少不少外國書籍都很好(早些時候寫的我的書單),上面僅限於對一些「定位於入門書卻對小白很不友好」的書的不滿。objective-c
話說多了,接着說書,上述四本書都是去年買的,《Swifter》《iOS開發進階》和《objective-c編程》也是。最後一本語法書,頗有細細閱讀的必要,重要的點基本都講到了,但沒寫過代碼時看一些知識可能會難理解,邊寫代碼邊常讀它就不錯,《objective-c高級編程》和《Effective objective-c》是前天才買的,薄得讓人驚訝,但內容都不錯,前者講「三大語法糖」,很少說,後者只要讀過《Effective Java》或《Effective Javascript》天然會天生帶有好感(C++那本我沒讀過,估計也極好,這就是「品牌效應」),翻開看看,果真都是些最佳實踐的建議,像《聖經》中的箴言,輕輕讀一則,就能有所獲,熟悉的味道。另外,前天還買了本《iOS Auto Layout開發祕籍》,以前在storyboard中佈局時,對控件的約束讓我傷透了腦筋,不知道該參考什麼資料,只好摸索着弄,有了這本書,能夠強化一下。算法
上面說的是書,後來看了看官網文檔,感受很是好,雖然我英文閱讀能力不是很強,但配合着有道詞典的取詞插件閱讀起來閱讀效果還能夠。官網的優勢是權威,新,簡潔精準,安排合理,這是比全部書籍都好的方面,以致於不少人說有了官網文檔就沒必要買書了,不無道理。但官網文檔這樣多,用哪一個「目錄」作全景概覽,以什麼「次序」作閱讀學習呢?「搜索框」急用能夠,能頭痛醫頭腳痛醫腳(但這方面彷佛也不如google + stackoverflow),但做爲「系統學習」的起點就太沒次序和脈絡了;網絡上一篇講閱讀次序的帖子,有點過期了,雖然萬變不離其宗,但對陌生於文檔的新手,當「萬變」發生以後,怎樣才能「不離其宗」?做者沒說。最後發現仍是最老實的官網文檔入口頁http://developer.apple.com/develop/就不錯,tutorial作導航圖,api作字典,用前者尋找特定技術主題,用後者理解不一樣類庫功能,穿插學習一段時間,就能對重要知識有所掌握了。數據庫
除了書和文檔外,開源應用也是很好的學習對象,由於它是鮮活的,在模擬器裏直接能跑,還能改改代碼看效果,下下斷點看奧妙。我用的是開源中國的iOS客戶端的源碼。讀源碼,我習慣的方法是第一遍先概覽、通讀,無論三七二十一,讀將下去,不用太細,不用開模擬器,按最基本的線性順序,把整個項目的代碼過一遍(固然,有些包裏類的技術大同小異,只有業務的區別,則沒必要全讀,讀三分之一便可),而後第二遍,開模擬器(若是是web應用就是跑應用開瀏覽器),關注特定功能的前因後果,理解界面展現和響應時自始至終代碼的執行流程,對象和對象是怎麼組織的,類的父類是怎麼封裝的,重點看脈絡流程,至於具體的第三方或基礎類庫的使用,方法的調用,細微的算法,若是感受能學到東西,看看也能夠,不看也不要緊。重要的是,觀察源碼中分包分模塊的體系結構、功能響應時的流程流轉,這是「樹幹」和主要「分支」,至於具體細微的樹枝和葉子,暫時忽略之可也。編程
開發工具xcode,我到如今對之也不算熟悉,好在寫代碼的部分,會基本的打字、複製、粘貼就好了,更高深的使用,當以爲「xcode估計有這個功能」時,去google搜一下就好了,xcode的使用,《iOS9開發指南》很簡單的介紹很實用,官網更有詳細的教程(還沒看),《iOS開發進階》則給出了一些實用的工具(還沒用),感受再加上搜索引擎,就沒有問題了。重要仍是要熟練,「工欲善其事」嘛。
頁面知識兩大要點:一是在單個頁面中,組件的使用和約束的使用,二是多個頁面的協做。
單個頁面中,基本組件加到頁面中最簡單,拖拽便可,綁定到Controller的變量上、及綁定響應方法也極簡單,同時開storyboard和Controller,拖拽便可。由於「Controller持有控件」與「Controller提供響應函數」是有界面編程(且無論命之曰mvc仍是mvvm吧)天經地義的規則,因此xcode直接用ide實現了,而不像android那樣還要用第三方的ioc框架,或者angular那樣手動的聲明。固然,若是比較喜歡鼠標的移動和左右鍵的點擊,以及鍵盤組合鍵的使用,喜歡「碼之」而不是「拽之」的同窗,手動寫代碼聲明組件對象,並添加到Controller的屬性上,添加到Controller的view中,甚至手動添加約束,也是能夠的。只是,這樣作,比起拽來拽去,工做量未免多太多了,因此何時用碼的,何時用拽的,就要視組裏結構及項目特徵而定,對於我我的,由於單打獨鬥,又是新手,因此兩種都試試,在實踐中學習之。
組件能夠自定義,這是固然的,跟android同樣,提供一個回調方法,在其中用畫布繪製本身的自定義樣式,便可聲明一個組件類。很少說。
使用約束,大約對應android的RelativeLayout,相對佈局,在網頁佈局中對應的卻不是position:relative而是absolute,脫離文檔流。手動指定誰在誰左面,誰在誰上面,距離多少。但這種方法,始終是「奇兵」,「正兵」依然是先上後下、先左後右的線性佈局,即html中的文檔流,android中的LinearLayout,iOS中怎麼實現?看開源中國的代碼,開了個眼界,用tableview實現LinearLayout的效果,指定第一行單元格應該是啥,第二行應該是啥..不過感受,這跟古老的html中用table佈局有殊途同歸的地方,html的table佈局早就被揚棄了,不知道iOS中,tableview當LinearLayout的用法,是否是主流,仍是有更好的方案,須要繼續研究。
多頁面協做,最經常使用無非是基本彈出、進退導航、標籤切換這三種,除了基本彈出太基本外,進退導航和標籤切換也被提供了原生的支持。android中標籤放到底部,還須要手動實現,iOS直接拖拽就好了;但iOS中Navigation導航還要在storyboard上佈置下,android相對簡單些,究其緣由,是android手機自帶後退鍵,故「前進」「後退」是天經地義,而iOS只能在標題欄顯示按鈕來點。相比網頁,網頁中的主要跳轉固然是前進後退,進棧出棧,而「選項卡」在網頁中多做爲局部控件點綴使用,與app的「標籤」對應的實際上是網頁的「菜單」,但網頁點擊菜單,其實通常也是「前進」的,除了opoa的新潮頁面,和古老的iframe嵌套頁面外。但app的標籤切換基本就至關於iframe.src賦值。
app的數據知識,無非兩點,一是本地存儲,二是rest交互。
本地存儲,分爲直接寫文件、寫鍵值對、寫數據庫三種,都有基本實現,很少說。
rest交互,自帶或第三方都有方便的庫,根據供求關係,基本需求必有方便供給,也不用多說。
其實蘋果版app到如今也未上線,這方面經驗還待補充。
功能實現,基本上界面知識與數據知識結合即等於一切,在前面安卓那篇給過的公式。
第三方依賴,也是有事實標準的,很少說。
登陸邏輯,跟安卓邏輯同樣,只是不一樣平臺具體代碼的區別,很少說。
app嵌html,也沒實際用過。
我不喜歡oc,我討厭大括號調用的寫法,我不以爲把方法每一個參數的含義都顯示出來有什麼必要性。
但不能只用swift,比如java開發雖然ssh是主流,直接用servlet的少見了,但servlet的基礎纔是安全感和信心的保障和來源。
並且,聽說swift也不免要用到oc的遺留類,躲老是躲不掉的。
或許oc變熟悉以後,再看c和c++的代碼都會更熟悉一點?
面向對象的語言,封裝繼承多態,萬變不離其宗,擁有界面的編程,狀態事件響應,是亙古不變的規矩。mvc和mvvm?區別有想象中那麼大麼?
越作應用就越以爲荒蕪,感受在同一地方兜兜轉轉,所謂語言切換,打通全棧,也不過是今天吃個蘋果,明天吃個梨子的變換,變來變去都是同樣。
就回頭,在畢業幾年後,回頭學計算機組成原理,操做系統,數據結構和算法,網絡。以前的幾年,我學的是設計模式,重構,軟件工程,語言框架。
計算機的海洋,浩瀚無邊,編程語言和應用領域,以及具體產品,其實都是客體,內功強大了,用什麼招式,拿什麼語言,都能虎虎生風。君子不器。
而內功,也許是哲學,理解世界運行的方式,才能在程序裏更好地模擬之。(例如:面向對象)
也許是心理學,理解用戶生活的習慣,才能在設計上更好地幫助之。
也許是邏輯能力和思辯方式,有了更好的溝通能力,才能跟同事、用戶、客戶產生高質量的交流,而交流,是產品之本。
也許是FQ能力,英文水平,搜索引擎使用能力,閱讀能力,寫做能力。
這些都很重要,但咱們老是忽略它。
「不用管別的,如今就開工寫代碼,有了問題『百度』一下!」
多少次就這樣,在戰術上的勤奮,日復一日的加班中,像拉磨同樣原地打轉,自覺得作了不少工,實際上卻無進展。
不少時候該退出來,在戰略上想想,這五年打算作什麼,下個五年呢?
咱們要養成的,是佈局本身人生的習慣。
「與其戀子以求生,不如棄子而取勢」,有價值的事情,未必就要作,所謂「價值觀」,所謂「取捨」,都包含了捨棄有價值的東西的部分。
而咱們最寶貴的,是時間,作了這,就不能作那,在經濟學上,這叫「機會成本」。
若是咱們但願,在有生之年,在世界上打出一塊屬於本身的天地,那咱們如今該準備的是什麼?這纔是問題的關鍵。
不要拉磨拉得興起,汗流浹背每天加班,每個月賺個兩三萬就心滿意足了。這真的是你青春的價值嗎?
此時此刻你身邊蠢人對你是羨慕嫉妒恨,仍是小瞧,真的並不重要,你活着不是爲了給他們看的。
這篇寫iOS,很是小白,基本沒有價值,若是有價值,就是這裏議論的幾句話。
但願對有緣看到這裏的編程的朋友有所啓發。
由於咱們知道,咱們中不少朋友,是會鑽到代碼渾然忘個人,這很好,能讓編碼能力猛增,但同時,可能會忘了後退一步看看天空。
別用戰術的勤奮掩蓋戰略的懶惰。
多想想。
棄小取大。
佈局人生。