如何系統學習 iOS 開發?

發表於2013-03-25

來源:知乎

有網友在知乎提問:“本人大四學生,用iOS裝置兩年多了,真正的接觸開發有半年時間吧,之前Java基礎還行。現在感覺有點小瓶頸,很多東西僅僅限於會用或者按照規範依葫蘆畫瓢,但不知道深層次的原理以及為什麼這樣做,感覺知識學習不夠系統,經常遇到一些NS類不知所以,翻查Apple的docs有時也看不太懂(可能有外語水平問題,但應該不是主要原因),比如NSApplication、NSOperation、NSRunLoop等。哪位前輩能指點一下進一步的學習方法?”  Wang Hailong 的回覆的投票數最高,整理如下:

我當時剛學iOS開發的時候一樣的感覺,總想知道原理,內部怎麼回事,感覺在像在霧裡。但是iOS開發就是這樣,它是封閉的 本身就是在霧裡…

關於iOS開發的學習,打個比方就像把汽車分解:

  • 最底層的原料有塑料,鋼鐵
  • 再用這些底層的東西造出來發動機,座椅
  • 最後再加上寫螺絲,膠水等,把汽車就拼起來了

iOS基本都是英文的資料,也由於封閉,文件寫的相當好。在遇到新框架的時候:

  • 弄明白框架的功能
  • 去文件裡搜搜 框架的 Programming Guide 很有用
  • 要弄明白框架類的繼承結構

寫iOS的程式不一定都是用OBJC,很多框架是用C寫的。學習iOS開發基礎可以按照下面兩個方面學:

  1. 基礎 (原料 鋼鐵 塑料)
  • OBJ-C — 語法弄明白 @interface @property 這些東西總要知道是幹嘛的 怎麼用
  • 基礎庫 — NSString NSArray NSDictionary等 這些東西在所有的框架裡都會出現
    • iOS大部分類都是繼承自NSObject (我還沒見過不是繼承自NSObject的..)
    • 還有一些 像NSCopying的介面(經@李禹龍提醒 應該叫協議) 不是特別用到開始不用瞭解
    • NSObject 建立物件的時候用 + (id)alloc 方法 建立後需要init方法初始化 這個init指的是所有前面是init的方法比如UIView的初始化方法是 – (id)initWithFrame:(CGRect)aRect 在Objc裡有很多這樣關於函式命名的約定 類似於在python中的函式__xxx
    • NSString 字串 NSArray 陣列 NSDictionary 字典 這些都需要弄很清楚 其他的類都是一個套路
    • NSMutableArray 這樣帶Mutable的類代表可變的 繼承自相應的不可變類 比如NSMutableArray繼承自NSArray 他們都新增了可以改變物件內容的方法比如
      • – (void)addObject:(id)anObject 新增物件
      • – (void)removeObject:(id)anObject 刪除物件
    • 上面只是一個大概的總結 還有很多東西需要學 iOS5的SDK已經支援ARC 可以自動進行release 但是對iOS4的支援還有一個小問題 現在要開發應用 可能還需要按照之前的MRC的方式alloc release retain autorelease 之類的記憶體管理方法 不過如果你現在開始學 到編出像樣的APP iOS5可能已經普及了 可以直接用ARC (另 之前對ARC的瞭解很粗淺 現在開發程式完全可以直接ARC iOS4不支援的weak是有辦法替代的 用unsafe_unretained 如果同時支援iOS5和iOS4 用巨集判斷下就可以 當然也可以直接用assign)
    • 還有一點開始學習的時候肯定很疑惑 記憶體管理是基於函式名稱的 比如帶alloc copy的函式 用了之後返回的物件一定要release 這個不用疑惑 照做就行了
  • 文件:CocoaFundamentals Introduction
  1. 高階庫(發動機)
  • UIKit — UI庫 OBJC
    • UIResponder 父類是NSObject UIKit裡最底層的庫 可以響應一些觸控事件 設定焦點等功能
    • UIView 父類是UIResponder 所有View的父類 方法太多了 大部分很有用 這個不贅述了 中文的資料也很多了
    • 關於UIView的子類 有很多 UIButton UITableView 這個都需要各個擊破 看看文件從名字上就很容易理解是做什麼的
    • UIViewController 是管理View 和 Model的類 (@張開 說UIViewController是用來管理view的,管理model 的類自己寫,當然,model也可以用UIViewController來管理,不過恐怕成為不好的程式碼。 的確是這樣的 Model的改變最好通過Notification來傳播 之前吃過這樣的虧 最好不要用delegate模式)
      • UIViewController 管理所有裝置發生的事件 比如螢幕旋轉 螢幕關閉 或者一些其他的 程式的控制邏輯也應該寫在這裡
      • 他的初始化函式是- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 後面那個NibName 是Interface Builder 裡設計的介面
        • 現在IB已經整合到XCode裡了 開啟.xib的檔案開啟的就是IB
        • IB和程式碼互動用的是IBAction IBOutlet 這些標記 這些標記追蹤到他們的定義其實對編譯器來說什麼都不表示 只能IB識別
        • IB也沒那麼高深 XIB檔案解開之後就是一堆程式碼
        • 之前面過一家小公司 看我當時寫的程式裡面用到了IB 一臉不屑 說他們都是用程式碼控制view 意思他們玩的都是高科技 IB都是垃圾 很多人也糾結到底用不用IB 的確 很多時候IB靈活度不行 但是不需要靈活度的時候還不用IB 那不是裝X嗎 要是沒人用蘋果還開發IB幹嘛 早去掉了 IB在很多時候節省很多工作量
    • UINavigationController 再說說NavigationController
      • 剛接觸開發的時候 不明白 View和View之間怎麼切換的 最重要的就是UINavigationController 他是一層一層推進view的 開啟iPhone裡的聯絡人 每點一個聯絡人螢幕就會像右推到下一個介面 這就是UINavigationController在做的事
      • UINavigationController 維護一個堆疊
      • – (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 是像堆疊裡壓一個UIViewController
      • – (UIViewController *)popViewControllerAnimated:(BOOL)animated 是從堆疊裡彈出來一個UIViewController
      • 就算你的程式不是像聯絡人那樣 向右推進 也可以用UINavigationController 管理你的ViewController的層次 可以自己寫View切換的動畫 關掉他預設的動畫
      • 文件: /ViewControllerPGforiPhoneOS/ModalViewControllers
    • UIWindow 還有個蛋疼的UIWindow 都快忘了他了 因為iOS是從Mac os X過來的 很多東西直接拿來用 這個UIWindow就是 在iOS裡 每個App獨佔螢幕 所以同時存在的只有一個UIWindow 除了在程式載入的時候把我的view 載入到他上 目前我還沒用到過其他的
    • 蘋果一直很推崇MVC的程式結構 檢視 模型 控制器 簡單說就是 檢視負責顯示內容 模型負責所有資料的儲存結構或者一些其他資料操作 控制器是用來協調 檢視和模型 舉車的發動機系統的例子 檢視是儀表盤 模型是發動機 控制器是控制晶片
  • Core Data — 管理資料 OBJC
    • 剛學的時候覺得 CD很高深 其實他是最容易用的庫之一 他麻煩之處在於多執行緒問題 還有膠水程式碼的問題
    • 建立一個 基於Core Data的工程 你會看到他自動建立3個類的物件
      • NSManagedObjectModel
        • 管理資料的儲存結構檔案 副檔名是 xcdatamodeld
      • NSPersistentStoreCoordinator
        • 用來管理底層資料的儲存 用官方的話說

          Core Data is not a relational database or a relational database management system (RDBMS).

        • 所以你可以用很多方法儲存資料 比如最長用的sqlite 當然如果另類也可以用plist檔案 或者其他
      • NSManagedObjectContext
        • NSManagedObjectContext 把上面兩個物件連在一起 把他們變成一個整體
        • 所有的CD操作都是通過這個類的 這個需要仔細看文件了
      • 舉個不恰當的例子 就像三個人收拾衣服 一個人負責衣服的存放位置(NSManagedObjectModel) 一個人負責把衣服分類 冬天穿 夏天穿等(NSPersistentStoreCoordinator) 一個人負責協調他們的工作 並且如果有新增加的衣服或者要移除之前的衣服 通知他倆(NSManagedObjectContext)
    • NSManagedObject 這個類是具體的資料物件 用上面的例子說就是衣服
      • 一般都是繼承這個物件 XCode 可以幫你做 具體搜搜 這種文章很多
    • NSFetchRequest
      • 用來執行CD請求的 相當與select語句外殼
    • NSEntityDescription
      • 用來描述實體的 對應sql裡的table
    • NSPredicate
      • 謂語 類似select語句中的條件
    • 上面這三個類就可以用來請求資料了 具體看教程吧
    • 中文介紹:http://c.gzl.name/archives/tag/core-data (訪問需要點技術…)
    • 文件: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/cdprogrammingguide.html

掌握上面的內容 差不多就能寫個APP了 最好的學習方法就是邊寫邊學 自己構想一個小的APP 在做的時候遇到問題 去找找資料 我覺得這樣學習比較快 也比較紮實
下面這些庫都是有專門功能的庫

  • Core Animation — 製作動畫 很強大 很喜歡的框架 可以用少量的程式碼寫出漂亮的動畫 C
  • Quartz 2D — 強大的2D繪相簿 C
  • OpenGL — 不用介紹了 超級強大的3D庫 C
  • Core Image — 聽說 iOS5開始支援Core Image 了 還沒去看 Mac 上的CI是很強大的
  • CFNetwork — 從來沒用過 我一般都會用ASIHttpRequset 封裝好的高層網路庫 OBJC實現的 CFNetwork 好像是C實現
  • Core Location — 獲取位置的庫 東西很少 很簡單 OBJC
  • AVFoundation — 播放視訊相關的庫 最近正在學習

這些算是學iOS開發的一些方法,當時要是有人告訴我這些,估計少走不少彎路。還有提醒各位初學者,剛開始學的時候會有幾個月的低谷期,很容易放棄。如果挺過最開始的幾個月,後來就越學越容易了。

 

 

相關文章