一 OC 小結
1 什麼是 OC 語言?
OC 語言即面向對象語言,它擴展了 ANSI C 語言,將 SmallTalk 式的消息傳遞機制加入到 ANSI C 中.它是蘋果 OS 和 iOS 以及相關的 API,Cocoa 和 Cocoa Touch 的主要編程語言.
2 OC 語言的特點:
3 iOS 的生態系統不僅僅指其軟件方面的豐富,更多指的是其設備的多樣性.
4 Core OS
是用 FreeBSD 和Mach所改寫的Darwin,是開源的符合 POSIX 標准的一個 UNIX 核心.該層包含所有 iOS 的基礎功能(所有的這些功能都是通過 C 語言的 API 來提供的).另外該層具有 UNIX 特點,因此當將 UNIX 上的功能移植到 iOS 上的時候用到Core OS 的 API.同時該層還提供了硬件和系統框架之間的接口,但出於安全考慮,只有有限的框架能使用.
5 Core Services
它在 Core OS 的基礎上提供了更為豐富的功能,其中包括 Foundation.Framework 和 Core Foundation.Framework.之所以叫 Foundation 是因為,它提供了處理字串,排列,時間等基礎功能.).其中 Foundation 屬於 OC 是 API, 而 Core Foundation 屬於 C 的 API.另外 Core Sercies 還提供了Security(處理認證,密碼管理,安全性管理),Core Location(定位)SQLite(輕量級的數據庫),Address Book(處理電話本)等功能.
6 Media
即提供圖像,音樂,影片等多媒體功能.其中圖片包括2D(Quartz 2D) 和3D(Open GLES).音樂對應的模塊是Core Audio 和Open AL. 影片用 Media Player來支持.最後還提供了Core Animation動畫支持.
7 Cocoa Touch
它是 OC的 API其中最核心的部分的 UIKit.Framework,應用程序上的各種組件全部由它來提供實現.除此之外還負責多點觸摸.文字的輸出,圖片網頁的顯示,相機/文件的存取以及加速感應的部分.
8 swift
它繼承了 OC 的面向對象優點,同時又具有簡便的語法結構.它具有以下特點.
9 OC 和 Swift 之間的區別
注:如果不想要break的效果 即後面的都想執行 那就寫上關鍵字 fallThrough,但在fallThrough後面就不能再定義常量變量了
10 swift 獨有的特點
Var a = (x:15,y:20.0)
其中 a 就是元祖名,裡面有兩個元素 x和 y.
取出賦值:a.x = 10或者 a.0 = 10(默認有下標)
修改類型: var a = (int,string) = (10,21.0)
打印時: printIn(a) = (10,20.0)
用下劃線省略不需要的元素 var a = (_,20.0)
原來是形式: func Sum(num1:int,num2:int) àint{} 調用: Sum(10,20)
現在:func Sum(numOne num1:int,numTwo num2:int) àint{}
調用: Sum(numOne:10,numTwo:20)
func addPerson(name:string,age:Int = 18) à string{}
調用: addPerson(“tom”)
注:修改年齡時 addPerson(“Tom”,age:19)
二 ARC 和 MRC 內存管理
從 MRC—>ARC 就是將內存管理部分,從開發者的函數中轉移到函數外部的runtime 中.由於 runtime 的開發簡單,邏輯層次高,所以 runtime 的出錯幾率很小,另外由於編譯器的優化,使得運行速度很高.
ARC 的特點:
三 NSURLConnettion , NSURLSession,AFN 以及SYNetFrame處理網絡請求
1 NSURLConnettion
NSURLConnettion是 Core Foundation/CFNetwork框架 API 之上的一個抽象. NSURLConnettion是用來指代 Core Foundation 框架中的一系列組件: NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage以及同名類NSURLConnection.
注1:原來的使用原理:一個 NSURLRequest 發送給 NSURLConnect.被委托對象(遵守 NSURLConnectionDeledate 和 NSURLConnectionDataDeledate 非正式協議)異步返回一個 NSURLResponce 和服務器的 NSData.
注2:在一個請求發送給服務器的時候,系統會先查詢緩存信息,然後根據策略和可用寫的不同,當在緩存中找到響應則直接返回.否則,系統將根據我們的策略,將接到請求後的響應緩存到並返回.
注3:在把請求發送給服務器的時候,服務器會發出鑒權查詢,這可以有共享的 cookie 或者機密存儲來自動響應,或者由被委托的對象來響應.發送中的請求,也可以被 NSURLProtocol 攔截,以便在必要的時候,無縫的改變其請求.
NSURLConnettion是使用步驟:
1 獲取一個 URL
2 通過 URL 創建一個請求
3 用NSURLConnettion發送請求
2 NSURLSession
和 NSURLConnection 一樣, NSURLSession 不僅僅包括同名的 NSURLSession, 還包括NSURLRequest 和 NSURLCache. 同時將NSURLConnection 對應為NSURLSession,NSURLSessionFiguration 以及NSURLSession 的三個子類,即NSURLSessionTask,NSURLSessionUpLoadTask 和 NSULSessionDownLoadTask.
和 NSURLConnection 相比, NSURLSession 最大的改變可以配置每一個緩存的session 緩存, cookie 值,協議以及證書策略甚至跨程序共享這些信息.這保證了程序和網絡框架之間的相互獨立.每一個 NSURLSession 有一個 NSURLSessionConfiguration 來進行初始化, NSURLSessionConfiguration指定了策略,以及在移動設備上增強性能的選項.
NSURLSession 的另一個特點就是 session Task, 用來處理的上傳和下載.和 NSURLConnection 最大的不同之處在於,所有的 task 共享其創造者 NSURLSession.
注: NSURLSessionTask分析
NSURLSessionTask 是一個抽象類,裡面包含NSURLSessionDataTask , NSURLSessionDownLoadTask 以及 NSURLSessionUpLoadTask三個子類.這三個子類封裝了網絡的基本任務:獲取數據,上傳和下載
使用原理:當一個 NSURLSessionDataTask 完成的時候,會有一個返回的數據,一個 NSURLSessionDownLoadTask 完成的時候會帶一個臨時文件的路徑.文件上傳的時候也會返回一定的數據,所以可以說 NSURLSessionUpLoadTask 是繼承於 NSURLSessionDataTask.所有的 Task 都可以取消,暫停和恢復,當暫停的時候會記錄當前的位置,以便下載繼續從此點繼續下載.需要說明的是 NSURLSessionTask 是由 NSURLSession 創建的.
NSURLSession的使用步驟:和 NSURLConnection 基本相似,然後使用resume方法來將它運行.
1 獲取一個 URL
2 通過 URL 創建一個請求
2.1 創建一個上傳的NSData(UpLoad 上傳的時候用)
3 創建一個NSURLSession的單例
4 通過NSURLSession發送請求(注:使用 resume)
3 NSURLSession 和 NSURLConnection 的區別
NSURLSession即有 session 的代理方法又有 Task 的代理方法.session 的代理方法用來處理連接層的問題(服務器的信任,客戶端證書的評估等),Task 的代理方法用來處理鑒權查詢和與網絡請求有關的問題.
4 AFN 框架
AFN 是對 NSURLConnection 的一層封裝
AFN 的主要功能:
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager(封裝了常用的 HTTP 方法)
AFHTTPRequestOperationManager的屬性
1 baseURL :開發者針要對 AFHTTPRequestOperationManager 自定義一個單例子類,設置 baseURL, 所有的網絡訪問,都只使用相對路徑即可.
2 requestSerializer :請求數據格式/默認是二進制的 HTTP
3 responseSerializer :響應的數據格式/默認是 JSON 格式
4 operationQueue
5 reachabilityManager :網絡連接管理器
AFHTTPRequestOperationManager方法:
1 manager :方便創建管理器的類方法
2 HTTPRequestOperationWithRequest :在訪問服務器時,如果要告訴服務器一些附加信息,都需要在 Request 中設置
3 GET
4 POST
AFURLSessionManager
AFHTTPSessionManager(封裝了常用的 HTTP 方法)
1 GET
2 POST
3 UIKit+AFNetWorking分類
4 NSProgress(利用 KVO)
AFURLRequestSerialization :請求的數據格式/默認是二進制的
AFURLResponseSerialization :響應的數據格式/默認是JSON格式
1 安全策略:(HTTPS 和AFSecurityPolicy)
2 網絡檢測: (對鏈接方式進行了封裝和 AFNetWorkingReachabiliManager)
使用鏈接: http://www.cnblogs.com/worldtraveler/p/4736643.html
AFN 的使用步驟:
1 創建一個請求操作管理者
2 聲明響應結果進行 JSON,XML等數據解析,返回 Data
3 設置請求參數
4 發送請求
補充 ASI: (功能很強大,但是已經不更新了)
ASI 使用步驟:
1 獲取 URL
2 獲取 ASI 請求對象
3 發送請求
AFN和ASI的區別
一、底層實現
1> AFN的底層基於OC的NSURLConnection和NSURLSession
2> ASI的底層基於純C語言的CFNetwork框架
3> ASI的運行性能 高於 AFN
二、對服務器返回的數據處理
1> ASI沒有直接提供對服務器數據處理的方式,直接返回data\string
2> AFN提供了多種對服務器數據處理的方式
* JSON處理
* XML處理
* 其他處理
三、監聽請求的過程
1> AFN提供了success和failure兩個block來監聽請求的過程(只能監聽成功和失敗)
* success : 請求成功後調用
* failure : 請求失敗後調用
2> ASI提供了3套方案,每一套方案都能監聽請求的完整過程
(監聽請求開始、接收到響應頭信息、接受到具體數據、接受完畢、請求失敗)
* 成為代理,遵守協議,實現協議中的代理方法
* 成為代理,不遵守協議,自定義代理方法
* 設置block
四、在文件下載和文件上傳的使用難易度
1> AFN
* 不容易監聽下載進度和上傳進度
* 不容易實現斷點續傳
* 一般只用來下載不大的文件
2> ASI
* 非常容易實現下載和上傳
* 非常容易監聽下載進度和上傳進度
* 非常容易實現斷點續傳
* 下載或大或小的文件都行
五、ASI提供了更多的實用功能
1> 控制圈圈要不要在請求過程中轉
2> 可以輕松地設置請求之間的依賴:每一個請求都是一個NSOperation對象
3> 可以統一管理所有請求(還專門提供了一個叫做ASINetworkQueue來管理所有的請求對象)
* 暫停\恢復\取消所有的請求
* 監聽整個隊列中所有請求的下載進度和上傳進度
四 正式協議和非正式協議
正式協議:指的是一個以@ protocol方式命名的方法列表,它要求顯示的采用協議.包括@required 和@optional.
正義協議的意義:將正義協議中的方法剝離出來
非正式協議:定義為凡是 NSObject的類或其子類的類別.非正式協議的方法是自己定義的
五 HTTP 的 TCP/UDP 協議
1 TCP/IP 或者 UDP/IP 協議組,包括三層網絡協議即網絡層,傳輸層,應用層.
網絡層協議包括:IP 協議, ICMP 協議, ARP 協議, RARP 協議以及 BOOTP 協議.
傳輸層協議包括:TCP 和 UDP 協議
應用層協議包括:FTP,HTTP,SMTP,DNSTELNET 等.
TCP 需要三層握手, UDP 不需要
結論: HTTP 雖然是一個協議,但是其還是基於 TCP 的協議.
2 scoket
socket 即 TCP/IP 或者 UDP/IP
Scoket 的優缺點:
優點:
缺點:
HTTP 協議的優缺點
優點:
缺點:
總結: Scoket 適用於對傳輸速度,安全性,實時交互,費用等要求較高的時候使用.HTTP則相反,適用於快速開發
六 JSON/XML 數據解析
1 XML 即可擴展標記語言(標記是計算機可以理解的語言,通過標記計算機就可以處理事件).可擴展性指的是:定義這些標記語言的時候,既可以使用國際通用的語言(HTML),也可以使用自定義的標記語言.
1.1 簡單來說, XML 是一種數據的描述語言,但是呢, XML 沒有語言的基本功能即被計算機所讀取,因此 XML 需要用另一種語言來解讀.
1.2 XML 的基本特點
1.3小結
XML 是獨立於軟件和硬件之外的一種語言,它在 Web 中的作用幾乎和 HTML 一樣重要.XML 無處不在,它是軟件中傳遞的最常用的數據格式.並且越來越流行.
注: XML 可以用於移動端和 PC 端,它是用來保存和傳輸數據的, HTML 是用來展示數據.
1.4 XML 的特點
1.5 XML 的解析方式 DOM 和 SAX 解析
1.5.1 XML 的總體解析步驟:
1.5.2 DOM 和 SAX
DOM 即文檔對象類型, SAX即當前兩個主要使用的 API
1.5.3 DOM 和 SAX 的區別
> DOM 解析的時候將數據一次性讀入內存並進行解析, XML 解析的時候是以流的方式,邊讀入邊解析.因此對於比較大的 XML 是不適合用 DOM 解析的.
> DOM 用來處理 XML 文檔比較復雜或者隨機的處理 XML 文檔中的數據.而 SAX 處理的時候則是從頭到尾的一個個節點進行處理
2 JSON 解析
JSON 構建於兩種結構:(類似於)鍵值對和值的有序列表
2.1 JSON 的解析方法有: NSJSONSerialization(原生),TouchJson,SBJSON,
JSONKit.
2.2 JSON 解析步驟
2.3 JSON解析方法: http://blog.csdn.net/enuola/article/details/7903632/
3 XML 和 JSON 的區別
JSON:沒有結束標簽,更短,讀寫速度快,能夠使用內建的方法進行解析,使用數組,不使用保留字.總之 JSON 是一種輕量型的數據解析格式.
七 GCD 和 NSOperation
1 pthread 是 C 語言中的線程方式,不多做要求(了解)
創建方式: int resurt = pthread_creat(&pthread,NULL,demo,NULL);
2 NSThread 創建方式
NSThread*thread=[[NSThreadalloc]initWithTarget:selfselector:@selector(run)object:nil];
[threadstart];
[NSThreaddetachNewThreadSelector:@selector(run)toTarget:selfwithObject:nil];
[selfperformSelectorInBackground:@selector(run)withObject:nil];
3 GCD
3.1使用消息循環的時候必須指定的兩個條件:輸入源和循環方式
Runloop 接收輸入事件的來源有兩種:輸入源和定時源.
消息循環的兩種方式: NSDefaultRunloopMode和 NSRunloopCommenModels
3.2 主線程的消息循環默認是開啟的,子線程的消息循環需要手動開啟方式如下:
[[NSRunloop currentRunloop] run];
3.3 GCD的執行步驟
> 創建任務
> 將任務添加到隊列中
3.4 GCD 的兩種執行任務的函數:同步執行函數(dispatch_sync)和異步執行函數(dispatch_async)
3.5 同步和異步函數決定了要不要開啟子線程,並發隊列和串行隊列決定了執行的方式.
3.6 主隊列:若主線程正在執行代碼,則不調度線程等待主線程執行完成
主隊列同步執行---造成死鎖.
原因:主隊列等待主線程執行完畢,主線程等待主隊列空閒
主隊列和串行隊列的區別:
串行隊列:等上一個任務完成之後再調用當前任務
主隊列:在主線程上運行的隊列.當主線程上有任務執行的時候,不調度任務
3.7 全局隊列在本質上是並發隊列
3.8 比較
3.9 GCD 的特點
延遲操作:dispatch_after即在多少納秒之後,在那個隊列上,執行哪些操作
一次性執行:線程安全,可以代替互斥鎖的使用
調度組:多個異步任務完成之後再做其他操作即dispatch_group_t
4 NSOperation
4.1 NSOperation是一個抽象類
抽象類特點:不能直接使用,因為它的方法在自己的類中沒有實現,約束子類具有相同的屬性和方法,因此抽象類要使用子類
4.2 NSOperation的子類有三種
NSInvocationOperation,NSBlockOperation 和自定義的 operation
4.3 NSOperation 和 NSOperationQueue
先將要執行的操作封裝到NSOperation 中,然後再將NSOperation添加到NSOperationQueue 中.系統會將任務取出,並放在新線程上執行
NSOperation執行的時候默認是不會開啟新線程的,但是添加到NSOperationQueue 中後會開啟新線程
4.4 NSOperation和 GCD 比較
> GCD 是在 iOS4.0之後出現的,是對多核 CPU 做了優化,是 C 語言是技術
GCD 是將任務添加到隊列並以同步/異步執行的函數
GCD 的特點:延遲操作,一次性執行和調度組
> NSOperation iOS2.0推出,4.0後根據 GCD進行了重寫
將操作添加到隊列,就會自動執行操作的函數
特點:最大並發數,隊列的暫停/繼續,取消全部隊列的操作,指定操作間的依賴關系
最大並發數:同時執行的任務數.
注:指定完後,線程先去線程池中尋找有可用的線程,沒有找到後再創建新線程.並且線程執行完後放入線程池中,以待重用.
4.5 服務質量qualityOfService 用來設置操作的優先級
4.6 監聽操作的完成
4.7 設置操作依賴: [opB addDependence:opA];操作 B 依賴於操作 A
八 自動布局
1 自動布局經過的三個時期
MagicNumber->autoresizingMask->autolayout(6.0)
2 Masonry的使用
語法一般是 make.equalTo or make.greaterThanOrEqualTo or make.lessThanOrEqualTo + 倍數和位移修正
九 KVC KVO
1 KVC 鍵值編碼
1.1 作用:KVC 提供了一種在運行狀態而非編譯狀態情況下動態訪問對象的屬性/成員變量的方法.即 KVC 可以通過名稱使用該名稱的屬性.
1.2 使用注意:
1.3 實現原理
2 KVO 鍵值監聽 保持視圖和模型的同步
2.1 作用:當指定的對象發生改變的時候,該對象就會接收到通知.即每次指定的觀察者發生改變的時候,就會通知相應的觀察者
2.2 使用方法:
2.3 特點:當更改被監聽的值的時候,監聽者會立即接收到通知
2.4 KVO中誰要監聽誰注冊,然後對響應進行處理,使得觀察者與被觀察者完全解耦。KVO只檢測類中的屬性,並且屬性名都是通過NSString來查找,編譯器不會檢錯和補全,全部取決於自己
3 兩者之間的關系
KVC 是 KVO 實現的關鍵技術
十 通知,代理, block 以及單例設計模式
1 簡單對比
1.1 通知:
特點:一對多,多對多,多對一
原理:任何觀察者只要接收通知的名稱和發送者發送通知的名稱相同,則就會接到發送者發送的通知消息
實現步驟:發送通知,注冊觀察者接收通知,移除通知
1.2 代理
特點:一對一
原理:首先分清代理和被代理者.即被代理者不適合做某一件事,讓代理來做
使用步驟:(如圖 注: B 是被代理者, A 是代理)
1.3 block
block 是一個代碼塊,它可以傳遞任何數據
特點:一對一
原理:就是 block 函數的使用,即在一個地方聲明一個block, 在使用的時候,只要在使用的時候調用即可
使用步驟:首先創建一個 block 函數,在需要的地方調用 block 函數
1.4 單例設計模式
單例:即一個類中只有一個實例,並且自行實例化後可以在整個類中使用
使用步驟:
十一 四種動畫
1 動畫的三要素
1.1 CALayer和 UIView 很相似, UIView 有的功能 CALayer 基本上都有,因此說 CALayer 是覆蓋在 UIView 上薄薄的一層.UIView 和 CALayer 的區別是: UIView 上有點擊事件.CALayer 的用途有:一是對 view 的相關屬性設置(如圓角等),二是對 View 的動畫操作,因此可以說對 view 上的動畫操作,本質上是對 view 上的 layer 操作
1.2 CAAnimation 即動畫的分類
CABasicAnimation(基礎動畫):
通過設定起點,終點,時間,動畫會沿著設置點進行移動.
CAKeyframeAnimation(關鍵幀動畫):
即關鍵點的 frame,就是通過設置起點,中間的關鍵點,終點和時間, CALayer 就會沿著設定的點移動.
CAAnimationGroup(組動畫):
即將多個動畫或者多種動畫組合成一個組裡面依次運行.
CATransition(轉場動畫):
蘋果原生的一些特定的動畫
2 動畫的實現步驟
2.1 CALayer 的初始化並設置屬性
2.2 設置動畫的類型並設置動畫的屬性
2.3 添加動畫
十二 數據庫的使用
數據存儲的方式:plist,歸檔(NSKeyedArchiver),偏好設置(NSUserDefaults),write 寫入文件,SQLite,Cocoa Data
使用方式:
http://www.jianshu.com/p/933a035a6ad4
http://www.jianshu.com/p/14fd706b632d
十四 第三方 SDK 集成
注冊成為開發者à下載 SDKà看文檔
十五 runtime
運行時即在程序運行的時候要干的事情.
產生的原因是 C 語言中函數的執行是在編譯的時候就決定好了的,要執行的函數以及函數的執行順序等.OC是繼承於 C 的,是在 C 的基礎上添加了面向對象的特性,面向對象要求把編譯和鏈接的函數盡量向後推遲.OC和 C 有很大的不同,其中就包括 OC 的函數, OC 函數的調用屬於動態調用,就是說 OC 中在編譯的階段僅僅編譯一部分函數,而大部分函數是在程序運行的時候才動態編譯的,這就需要用到運行時.
運行時可以在程序運行的時候在動態的編譯和鏈接函數.同時運行時還具有自省即查看對象正在做的,不能做的以及合適的分發消息
更深入的了解:
OC 的 runtime 是一個運行時庫,它是一個主要有 C 語言和匯編語言寫成庫,給 C 添加了面向對象的特性創建了 OC.也就是說它是在類方法中被加載,完成方法的分發,方法的轉發等.OC 的 runtime 創造了所有的結構體,從而讓面向對象成為可能.
詳細了解: http://www.cocoachina.com/ios/20141008/9844.html
十七 APPWatch 和 XMPP
1 APPWatch的功能實現和控件基本和 iOS 一致的.
使用的注意點:
2 XMPP 即時通訊
即時通訊的實質是實時.
XMPP 實現步驟:節點連接服務器à服務器利用本地目錄系統中的證書對其認證à節點指定目標地址,服務器告知目標狀態à服務器查找連接並認證à節點之間進行交互
注: 只要知道程序的協議和程序的端口就能進行交互
十八 BUG 調試
http://stackoverflow.com
十九 git 和 SVN 及其比較
1 SVN屬於集中化版本控制系統,可以理解為 SVN = 版本控制+備份服務器.SVN 支持並行讀寫文件,支持代碼的版本化管理.其功能包括取出,導入,更新,分支,還原,改名等
特點: SVN 大多采用圖形化管理,易於上手.
2 Git 是一個分布式版本管理系統,其功能包括clone,pull,push,branch,merge,
rebase.
特點:程序代碼版本化管理
3 SVN 和 Git 的優缺點
3.1 SVN 的優缺點: SVN對中文支持好,操作簡單,使用沒有難度,實施人員都可輕松上手。使用界面統一,功能完善,操作方便
3.2 Git 的優缺點: 對`程序源代碼進行差異化的版本管理,代碼庫占極少的空間。易於代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。
4 總結: SVN更適用於項目管理, Git僅適用於代碼管理。