iOS知識樹,知識點(包括物件、Block、訊息轉發、GCD、執行時、runloop、動畫、Push、KVO、tableview,UIViewController、提交AppStore)

發表於2016-03-15

本文旨在總結iOS知識網路,知識點,該知識網路羅列出常見UIKit、Foundation的物件特點和一些使用經驗,可以看成是一本書;文字編輯採用樹的形式,對知識點進行羅列,並標註一些使用經驗(希望對初學者有用或給一些解決疑難雜症者提供思路;某些知識點會深入探討;通過總結希望站在一個較高平臺的角度全觀Objective-C。

知識樹中有些是原創文章,有些則是轉載網路上iOS大神的文章。由於篇幅的限制筆者會簡潔地介紹各個知識點,讀者可通過連結瞭解詳情。當然一個人的知識面是相當有限的,在給各位讀者提供知識參考的同時,歡迎大家對本文提意見。

/->UIViewController
|        ViewController在iOS只是一個非常重要的概念,其在一個App中所扮演的角色:
|            (1) View Management:管理View     (2) Data Marshalling:管理資料
|            (3) User Interactions:響應使用者互動 (4) Resource Management:管理資源
|            (5) Adaptivity:適配不同的螢幕尺寸空間的變化
|         生命週期一片楓葉點選 另外一篇點選
|        + (void)initialize +(void)load 的呼叫時機,區別點選
|        ViewDidLoad呼叫時機:當view被首次使用的時候,某些情況可提升效能
|        橫豎屏的坑點選。APP整體是豎屏,單個controller可以是橫屏的
                             |         兩種互動方式:push和present
                             |            左右滑動 – (void)pushViewController:(UIViewController *) animated:(BOOL)
|            模態,從下往上彈出 – (void)presentViewController:(UIViewController *) animated: (BOOL) completion:

                             |        還有一種:直接把Controller的view新增到另一個Controller上。
|-> UIView
                             |        
frame 和bound 的區別點選
                             |            frame 是相對父試圖座標的值; bound是本身座標系統的值
|        
layoutSubviews點選 需要將[super layoutSubviews];放到最後,不然iOS7有可能會有這個崩潰
                             |                 “Auto Layout still required after executing -layoutSubviews” iOS7上崩潰sdk缺陷 點選
                             |        每一個檢視有唯一的父檢視點選。addsubview操作把它從上一個父試圖中移除
                             |        善於使用hidden 使用animateWithDuration簡單地控制頁面切換效果
                             |        使用animateWithDuration簡單地控制頁面切換效果點選
                             |        簡單動畫 animateWithDuration點選
                             |->CALayer
                             |        CALayer是個簡單的類,它是用來在螢幕上顯示內容展示的矩形區域.容芳志出品點選
                             |        直接從NSObject繼承,少了UIResponder類,固CALayer悲催的不能響應任何使用者事件點選
|-> UIWindow
|            
每一個IOS程式都有一個UIWindow
                             |            UIWindow有三個層級,分別是Normal,StatusBar,Alert點選
                             |            keyWindow是指定的用來接收鍵盤以及非觸控類的訊息,
                             |            而且程式中每一個時刻只能有一個window是keyWindow。
                             |-> UIImage
                             |        載入圖片幾種方式點選
                             |            [UIImage imageNamed:@“xxx”] 系統快取到cache中
                             |            [UIImage imageWithContentsOfFile:path] 不快取
                             |            [UIImage imageWithData:data]  不快取
                             |           ★ 拉伸圖片,四角保持不變 resizableImageWithCapInsets:
                             |           ★ 載入gif圖片點選
                             |-> UILabel點選
                             |            沒有上下居中對齊,可以使用TTTAttributedLabel
                             |           ★   重寫drawTextInRect:方法,可以自定義繪製區域,比如可設定Inset
                             |            [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.textInsets)];
/
        /-> UIKit
        |
        |                    |-> UIButton

        |                    |            設定顏色,文字一定要指定button狀態
        |                    |            善於使用contentEdgeInsets,可以設定文字邊距點選
        |                    |            設定圓角可layer.cornerRadius
        |                    |-> UITextfield
|
                    |        隱藏鍵盤,[textfield resignFirstResponder]
        |                    |        ★ 任意頁面隱藏鍵盤點選
        |                    |-> UIScrollerView
|
                    |        上拉下拉原理點選
        |                    |-> UITableView
|
                    |        複用,注意重寫 – (void)prepareForReuse
        |                    |        dequeueReusableCellWithIdentifier 從重用池中獲取,可能是nil
        |                    |        dequeueReusableCellWithReuseIdentifier 同上,但是不會是nil
        |                    |        插入,刪除,移動section或item的順序,需遵循下面兩個步驟點選
        |                    |            1. 更新dataSource的資料
        |                    |            2. 呼叫相應的collection view方法刪除或者插入section或item
        |                    |        非常嚴格的條件:,在更新collection view之前,先更新datasource,
        |                    |        因為collection view總是假設你已經準備好打他source了 否則collection view收到錯誤的item,並造成crash
        |                    |        右側音序條點選
        |                    |        UITableView上拉、下拉原理點選
        |                    |        AsyncDisplayKit 流暢的解決方法點選
        |                    |        tableView正在滾動的時候,如果reloadData,偶爾發生App crash的情況點選
        |                    |        UITableview Deceleration 加速滑動(慣性滑動)、彈性迴歸原理點選
        |                    |-> UIDevice
|                    
|        裝置名 [UIDevice currentDevice].name,
        |                    |        系統版本號 [[UIDevice currentDevice].systemVersion doubleValue]; 點選
        |                    |        螢幕旋轉方向 [[UIDevice currentDevice] orientation]
        |                    |        區分iPad還是iPhone [UIDevice currentDevice].userInterfaceIdiom);
        |                    |-> UIScreen
| 
                   |        如何正確的繪製1畫素的線點選
        |                    |        保證邊距不變,內容等比例拉伸點選
        |                    |-> UIEdgeInsets
        |                    |       
實際顯示邊距,跟設定邊距的距離點選
        |                    ->自動佈局
|                             
Masonry
        |                             storyboard
        |
        |                    /-> NSObject 既是物件也是協議,可以將物件自動置nil 比如 int = 0 bool = NO
|                    |      幾乎所有類的基類或者協議點選
        |                    |        isKindOfClass:和isMemberOfClass:,通過這兩種方法可以確定一個類的從屬關係
        |                    |               後者測試一個接收器是否是一個指定類的例項;而後者可以測試類的從屬關係。
        |                    |       respondsToSelector: 方法測試一個接收器是否通過selector實現(implements)了一個標誌符話的方法
        |                    |       description方法,允許一個物件返回一個字串來描述它的內容;這個常用於除錯debug
        |                    |       encodeWithCoder: 和 initWithCoder:方法,NSCoding協議中僅有的組成成員
        |                    |               第一個允許物件編譯它的例項變數,第二個允許一個物件初始化它自身的解碼例項變數。
        |                    |       conformsToProtocol:方法,測試接收器(物件或者類)符合一個給定的協議(protocol)
        |                    |       類物件中的 isa 指向類結構被稱作 metaclass點選跟[object class]有點區別,比如KVO的時候
        |                    |       __weak如何實現物件值自動設定為nil的點選
|                    |-> NSString & NSMutableString
|                    |       
NSString作為屬性時候,用copy還是strong修飾?
        |                    |        strong是單純的增加物件的引用計數,而copy操作是執行了一次深拷貝點選
|                    |-> NSArray & NSMutableArray
|                    |
       NSArray 各種遍歷方式,倒序遍歷點選
        |                    |       NSArray簡便初始化方法@[@”1″,@”2″];
        |                    |       淺拷貝。陣列本身使用地址,但是陣列item仍是舊物件Apple 官方解釋點選
        |                    |           無論copy、arrayWithArray、copyWithZone 陣列內物件並沒有變。
        |                    |           只是copy出來的array是新地址,arrayWithArray出來的陣列也是新地址。
        |                    |       深拷貝。陣列本身使用地址,但是陣列item是新地址
        |                    |           [[NSArray alloc] initWithArray:someArray copyItems: YES];
        |                    |           深拷貝時候,陣列中的item必須實現NSCopying協議並實現copyWithZone:
        |                    |       防止NSArray was mutated while being enumerated
        |                    |       array包含array的情況深拷貝。NSArray* trueDeepCopyArray = [NSKeyedUnarchiver         
        |                    |               unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:oldArray]];
        |                    |       containsObject 注意:在對比陣列中元素的時候,呼叫元素的isEqual的返回值。
        |                    |-> NSDictionary & NSMutableDictionary
        |                    |       取值時候,最好判斷object的型別。    if ([object isKindOfClass:[NSString class]]){ //todo};
        |                    |-> NSNumber 和 NSInteger NSRange
        |                    |          前者專門用來裝基礎型別的物件,把整型、單精度、雙精度、字元型等基礎型別儲存為物件
        |                    |-> NSNull  FMDB資料庫,使用的時候崩潰
        |                    |           JsonKit轉換以後會生出相應的[NSNull null]物件點選
        |                    |-> NSData 位元組緩衝區
        |                    |          + (nullable instancetype)dataWithContentsOfURL:(NSURL *)url
        |                    |          dataWithContentsOfURL 雖然是同步的,但可以結合gcd 非同步載入網路圖片點選
        |                    |-> NSUserDefaults點選
        |                    |            可用於APP setting 預設值不好用,SDK bug
        |                    |            設定WebVIew的UA點選
        |                    |-> NSDate & NSDateFormatter & NSCalendar
        |                    |            可判斷過去幾個小時,還是幾天 – (NSDateComponents *) components:fromDate:toDate:options:
        |                    |           可獲取時間戳
        |                    |           有時候有8小時的時差,解決辦法點選
        |                    |           在開發iOS程式時對日期處理的總結點選
        |                    |-> NSCoding & NSCoder 僅有的兩個方法,資料的序列號和反序列化點選
        |                    |            – (void)encodeWithCoder:(NSCoder *)aCoder;
        |                    |            – (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
        |                    |-> NSCopying & NSZone
        |                    |          + (instancetype)allocWithZone:深拷貝,類似於memcpy這樣的C方法點選
        |                    |-> NSAutoreleasePool
        |                    |          降低記憶體峰值點選
        |                    |-> NSFileManager 刪除檔案的時候先判斷是否存在是個好習慣
        |                    |-> NSTimer
        |                    |
        NSTimer 簡單使用 點選
        |                    |        ★ NSTimer定時器時間並不精確,類似於公交車進站,堵車就不準時點選
        |                    |-> NSLog暴力列印,常用於測試點選
        |                    |-> NSClassFromString  從字串獲取類。NSStringFromClass,從類名獲取字串
        |                    |        ★ 不要小瞧這兩個API,配合使用,他可以做到程式碼邏輯解藕的效果。
|                 /
|-> Foundation
|                 

        |                    |-> NSIndexPath 鏈式結構;tableview用的比較多點選
        |                    |           初始化 [NSIndexPath indexPathForRow:0 inSection:1];
        |                    |-> NSError 網路變成經常用到
        |                    |-> NSException
        |                    |-> NSStringEncoding NSString的編碼格式,瞭解即可點選
        |                    |-> NSProgressIndicator
        |                    |-> NSBundle 是個目錄,包含了程式使用的資源,如影像,聲音,編譯好的程式碼,nib檔案點選
        |                    |-> NSNetServiceBrowser
        |                    |-> NSValue 可以包裝任意一個物件,可以用NSValue將struct存到NSArray和NSDictionary中。點選

        |                    |-> NSURLConnection iOS9已不再使用
        |                    |-> NSURLSession & NSURLSessionTask 點選NSURLSession提供的功能:
        |                    |            通過URL將資料下載到記憶體點選
        |                    |            通過URL將資料下載到檔案系統
        |                    |            將資料上傳到指定URL
        |                    |            在後臺完成上述功能點選
        |                    |-> NSURLRequest 包裝了網路請求的資訊點選
        |                    |-> NSInputStream & NSOutputStream socket程式設計點選
        |                    |-> NSPredicate
        |                    |            謂語查詢,原理和用法都類似於SQL中的where點選
        |                    |-> NSLayoutConstraint
        |                    |-> NSLock & NSRecursiveLock & NSCondition 
多執行緒鎖
        |                    |          最基本的同步鎖點選
        |                    |          @synchronized{//todo} 同樣也是同步鎖點選
        |                    |          事實上訊號量也能實現鎖的目的,訊號量和鎖的區別點選第二篇點選
        |                    |-> NSMethodSignature        
/                      |         配合NSInvocation實現訊息轉發點選
iOS                       |-> NSInvocation 直接呼叫 某個物件的訊息點選
                            |          iOS中可以直接呼叫 某個物件的訊息 方式有2種performSelector:withObject: 和NSInvocation
        |                    |          當然,還以用C語言的函式指標,參見下面的“方法調配技術
        |                    |-> NSSet 無序的物件集合,用處少
        |                    |-> NSUrl 基本使用,包含File URL和File path點選
        |                    |-> AVPlayer基本使用點選
        |                    |           獲取視訊時間長度 點選
        |                    -> NSNotificationCenter 同步的機制點選注意防止重複,相似的機制還有delegate,observer,block
        |
|                    /-> 建立push原理介紹、證照製作、測試push 專輯
 點選
|                    |       “iOS push全方位解析(一)【譯文】”——iOS PUSH概述點選
|                    |       “iOS push全方位解析(二)【譯文】”——生成OpenSSL證照,Provisioning Profile點選
|                    |       “iOS push全方位解析(三)【譯文】”——一個極簡的demo,並測試一下push點選
|               /
|-> Push
        |
|                    |
       
 iOS6、7、8、9 Push的演化 點選,但目前還是不盡人意(APP 無法獲取通知欄訊息數目)
|                    |       ★ php寫的可以在本機傳送iOS push程式點選
|                    |        iOS7 Background Remote Notification(後臺遠端通知——靜默push)點選
        |                    -> 有一些三方push SDK:極光push
|
        |-> block 必須掌握
        |             block專輯點選;Block帶有區域性變數的匿名函式;iOS開發尤其實用
        |              【block程式設計第一篇】 block程式設計熱點介紹(官方文件翻譯的)點選
        |              【block程式設計第二篇】 block捕獲變數和物件點選
        |              【block程式設計第三篇】block記憶體管理——如何驗證block在棧上,還是堆上點選
        |              【block程式設計第四篇】block的實現點選
        |              【block程式設計第五篇】block中使用 weak–strong dance 技術避免迴圈引用點選
        |-> 多執行緒
        |            iOS有三種多執行緒程式設計的技術,分別是:點選
        |                 1、NSThread 下面會講到
        |                 2、Cocoa NSOperation 下面會講到
        |                 3、GCD 下面會講到
        |                這三種程式設計方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單。
        |            dispatch_once 執行一次,用於建立單例點選可滿足執行緒安全
        |           iOS 不像C++ 那樣,可以直接將建構函式設成private所以建立絕對單例模型需重寫allocWithZone,點選
        |                
|                       /-> 引用計數(retainCount)
|                       |       retain 引用計數+1 物件alloc時,引用計數為1, release引用計數-1.引用計數=0時候,真正釋放
|                       |       autoRelease,自動釋放物件點選
|                       |-> 便捷構造方法 iOS
|                       |          物件在自動釋放池中,不需要開發者手動釋放,比如下面的方法
|                       |          NSString的stringWithString
        |                       |          NSArray的arrayWithObjects:和arrayWithArray:
|                       |          UIImage的imageNamed:
|                       |-> 記憶體管理高階指南官方譯點選
        |                       |-> 記憶體管理實踐點選
|                     /
|-> 記憶體管理專欄點選
|
|                       |-> MRC
手動引用計數。release和retain成對兒
|                       ->ARC 自動引用計數
|                            強烈建議使用ARC
|                            禁止在函式內返回區域性變數指標,不然就是野指標!
|                            容易引起迴圈引用的地方點選
        |                            – (id)performSelector:(SEL)aSelector withObject:(id)object;引起警告
        |                                    warning:performSelector may cause a leak because its selector 點選
        |
        |-> 程式間通訊(APP間通訊)點選】【點選
        |                 iOS可通過URL Scheme,呼叫別的APP(iOS內的應用呼叫協議),APP 實現 – (BOOL)application: openURL: options:
        |
        |                            /-> Runtime 執行時特點《執行時之一:類與物件》南峰子出品 點選
        |                            |        Objective-C程式設計師可以在程式執行時建立,檢 查,修改類,物件和它們的方法點選
        |                            |        Objective-C runtime庫也負責找出方法的最終執行程式碼
        |                            |        class  Objective-C類是由Class型別來表示的,它實際上是一個指向objc_class結構體的指標。
        |                            |                struct objc_class {
        |                            |                    Class isa  OBJC_ISA_AVAILABILITY;
        |                            |                #if !__OBJC2__
        |                            |                    Class super_class                       OBJC2_UNAVAILABLE;  // 父類
        |                            |                    const char *name                        OBJC2_UNAVAILABLE;  // 類名
        |                            |                    long version                                 OBJC2_UNAVAILABLE;  // 類的版本資訊,預設為0
        |                            |                    long info                              OBJC2_UNAVAILABLE;  // 類資訊,供執行期使用的一些位標識
        |                            |                    long instance_size                       OBJC2_UNAVAILABLE;  // 該類的例項變數大小
        |                            |                    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 該類的成員變數連結串列
        |                            |                    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定義的連結串列
        |                            |                    struct objc_cache *cache             OBJC2_UNAVAILABLE;  // 方法快取
        |                            |                    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 協議連結串列
        |                            |                #endif
        |                            |                } OBJC2_UNAVAILABLE;
        |                            |                1. isa:所有的類自身也是一個物件,這個物件的Class裡面也有一個isa指標,它指向metaClass
        |                            |                2. super_class:指向該類的父類,如果該類已經是最頂層的根類,則super_class為NULL。
        |                            |                3. cache:用於快取最近使用的方法。提高方法查詢效率
        |                            |        objc_object與id objc_object是表示一個類的例項的結構體
        |                            |                struct objc_object {
        |                            |                    Class isa  OBJC_ISA_AVAILABILITY;
        |                            |                };
        |                            |                typedef struct objc_object *id;
        |                            |           當建立一個類的例項物件時,分配的記憶體包含objc_object資料結構,然後是類的例項變數的資料。
        |                            |           NSObject類的alloc和allocWithZone:方法使用函式class_createInstance來建立objc_object資料結構。
        |                            |           另外還有我們常見的id,它是一個objc_object結構型別的指標
        |                            |        meta class元類,是一個類物件的類;它儲存著一個類的所有類方法。
        |                            |           當我們向一個物件傳送訊息時,runtime會在這個物件所屬的這個類的方法列表中查詢方法;
        |                            |           而向一個類傳送訊息時,會在這個類的meta-class的方法列表中查詢。

        |                            |        繼承體系點選
|
                            |        動態建立類點選
        |                            |            objc_setAssociatedObject點選給物件增加屬性,一般配合類別使用
        |
                            |            object_getClass  得到一個例項的類點選
        |                            |            objc_copyImageNames  獲取指定類所在動態庫南峰子出品點選
        |                            |            objc_copyClassList  建立並返回一個指向所有已註冊類的指標列表點選
        |                            |        class_xxx系列函式點選
        |                            |            class_copyPropertyList  獲取類的屬性
        |                            |            class_addMethod 為類新增方法
        |                            |            class_isMetaClass 判斷是否為元類
        |                            |            class_getName 獲取類名
        |                            |            class_copyIvarList 拷貝類的例項變數列表
        |                            |            class_getInstanceMethod 獲取例項方法
        |                            |-> Runnloop  ibireme出品 點選
        |                            |        RunLoop 實際上就是一個物件,這個物件管理了其需要處理的事件和訊息
        |                            |        並提供了一個入口函式來執行上面 Event Loop 的邏輯

        |                            |        Run Loop並非iOS平臺專屬的概念,在任何平臺的多執行緒程式設計中,為控制執行緒生命週期點選
        |                            |        接收處理非同步訊息,都需要類似Run Loop的迴圈機制來實現:從簡單的一個無限順序
        |                            |        do{sleep(1);//執行訊息}while(true),到高階平臺,如Android的Looper,都是類似的機制。
        |                            |       PerformSelecter 當呼叫 NSObject 的 performSelecter:afterDelay: 後,實際上其內部會建立一個 Timer
        |                            |                 並新增到當前執行緒的 RunLoop 中;所以如果當前執行緒沒有 RunLoop,則這個方法會失效點選
        |                          /
|-> iOS 動態機制
|
|                            |-> 訊息傳遞
 objc_msgSend點選南峰子出品 點選
        |                            |           obj-c脫胎於smalltalk的訊息處理。所有方法呼叫都是發訊息。訊息是啥?一串字元點選
        |                            |           如果向某物件傳遞訊息,那就會使用動態繫結機制來決定需要呼叫的方法
        |                            |           objc_msgSend有兩個隱藏引數,訊息接收物件 方法的selector ,即(self,_cmd)
        |                            |-> 訊息轉發 message forwarding點選        
        |                            |            就是物件在接收到無法解讀的訊息之後會發生什麼情況
        |                            |            (1) +(BOOL) resolveInstanceMethod:(SEL)selector 類是否新增一個例項方法
        |                            |            (2) resolveClassMethod 是否新增了類方法
        |                            |            (3) -(id) forwardingTargetForSelector:(SEL)selector 能不能把這條訊息轉給其他接收者來註冊
        |                            |            (4)-(void) forwardInvocation:(NSInvocation*)invocation  訊息派發系統
        |                            |            (5)最後若都不能處理訊息,則doesNotRecognizeSelector: 會丟擲異常
        |                            |            當我們不能確定一個物件是否能接收某個訊息時,會先呼叫respondsToSelector:來判斷一下
        |                            |-> SEL點選
        |                            |            SEL又叫選擇器,是表示一個方法的selector的指標,每一個方法都對應著一個SEL。
        |                            |            OC在編譯的時候,會根據方法的名字(包括引數序列),生成一個用 來區分這個方法的唯一的一個ID
        |                            |                這個ID就是SEL型別的。需要注意的是,只要方法的名字(包括引數序列)相同,那麼它們的ID都是相同的。
        |                            |                就是 說,不管是超類還是子類,不管是有沒有超類和子類的關係,只要名字相同那麼ID就是一樣的
        |                            |            方法的定義體裡面,我們可以通過訪問_cmd得到這個方法自己的SEL。
        |                            |-> 方法調配技術 method swizzling 用於除錯南峰子出品點選
        |                            |            IMP 它是objetive-C 方法(method)實現程式碼塊的地址,實際上是函式指標,指向方法實現的首地址
        |                            |                IMP imp = [requestItem.delegateTarget methodForSelector:selector];
        |                            |                void (*func)(id, SEL, ResponseItem *) = (void *)imp;
        |                            |                func(requestItem.delegateTarget, selector, responseItem);
        |                            |            可以從selector獲取IMP,比如:- (IMP)methodForSelector:(SEL)aSelector;
        |                            |            Swizzling應該總是在+load中執行
|                           -> 事件響應鏈點選另外一篇點選
        |                                        在 iOS 中,幾乎所有類都是 responder,比如 UIWindow、UIView、UIControl、UIControllers 等
        |                                        當手指去觸控螢幕上 UIView 的例項物件 aView。產生一個觸控事件 UIEventTypeTouches
        |                                        而接收觸控事件的物件 aView,就是一個 responder object。
        |                                        initial view –> super view –> …..–> view controller –> window –> Application –> AppDelegate
|
|
                              /-> 沙盒(Sandbox)iOS沙盒機制容芳志出品點選
        |                              |        每個應用程式都有自己的儲存空間
        |                              |         應用程式不能翻過自己的圍牆去訪問別的儲存空間的內容
        |                              |         應用程式請求的資料都要通過許可權檢測,假如不符合條件的話,不會被放行。
        |                              |-> Group iOS8+資料共享,例如擴充套件(Extension)共享資料點選
        |                              |-> Spotlight iOS9+ 系統搜尋。官方demo點選
        |                              |-> GCD(Grand Central Dispatch) iOS開發有一個強有力的多執行緒工具 點選
        |                              |            多執行緒入門raywenderlich出品 點選
        |                              
|            系統提供一個叫做 主佇列(main queue)
        |                              |            系統還提供一個叫做全域性排程佇列(Global Dispatch Queues)有四個優先順序
        |                              |            開發者自己建立佇列(序列,或者並行)
        |                              |            至少有五個佇列任你處置:主佇列、四個全域性排程佇列,再加上任何你自己建立的佇列。
        |                              |            GCD 深入理解:第一部分點選
        |                              |            GCD 深入理解:第二部分點選
        |                              |            開發常見方法介紹
        |                              |                  dispatch_after 延後工作
        |                              |                  Dispatch Groups 會在整個組的任務都完成時通知你
        |                              |            dispatch_semaphore_t  訊號量,讓你控制多個消費者對有限數量資源的訪問。點選
        |                              |            dispatch_semaphore_wait  使得訊號量-1,當=0時候阻塞
        |                              |            dispatch_semaphore_signal  釋放訊號量,即訊號量+1
        |                              |            
        |                              |-> CoreData資料持久化,相比sqlite有下面優勢點選
        |                              |          資料庫欄位或者表有更改會導致crash,CoreData的版本管理和資料遷移變得非常有用,
        |                              |          手動寫sql語句操作還是麻煩一些。
        |                              |          不光能操縱SQLite,CoreData和iCloud的結合也很好,如果有這方面需求的話優先考慮
        |                              |          並不是直接操縱資料庫,比如:使用CoreData時不能設定資料庫的主鍵,目前仍需要手動操作。
        |                              |          效率上其實跑程式時感覺不出來,畢竟手機上的資料不能跟網站的資料和訪問量相提並論。
        |                           /
        |-> 特殊封裝&平臺特性
|                           

|                              |-> 類別(Category)擴充套件(Extension)
微小區別點選
        |                              |         堪稱iOS程式設計的精髓點選念茜出品點選
        |                              |-> KVC 鍵值編碼
        |                              |          在IOS的中,沒有絕對的私有,包括方法和變數,可以通過字元獲取屬性點選
|                              |-> KVO 鍵值觀察,依賴isa-swizzling技術王中周出品 點選
|                              |        依賴Runtime 和KVC 一個新的類會動態被建立。詳細原理點選另外一篇點選
|                              |        同時派生類還重寫了 class 方法以“欺騙”外部呼叫者它就是起初的那個類。
|                              |        然後系統將這個物件的 isa 指標指向這個新誕生的派生類,因此這個物件就成為該派生類的物件了,
|                              |        因而在該物件上對 setter 的呼叫就會呼叫重寫的 setter,從而啟用鍵值通知機制
|                              |        Person在建立KVO監聽前和之後的列印輸出 self->isa:Person    [self class]:Person
        |                              |                    self->isa:NSKVONotifying_Person   [self class]:Person
|                              |        比如:Tableview上拉下拉動畫檢測offset;播放視訊,獲取視訊時長時候等
|                              |        為什麼KVO不成對兒呼叫,會崩潰?
|                              |-> 多工
|                              |      
後臺執行一段時間(不是地圖,voip類app)點選
|                              |-> 3D Touch ,通過在plist中新增選單,然後app實現下面的方法。進入APP
|                              |               – (void)application: performActionForShortcutItem: completionHandler:
|                              |-> spotlight 通過系統搜尋,進入APP點選
|                              -> Touch ID 如何使用iOS 8 指紋識別,程式碼、例項點選
        |-> HTTPs  
|                 建立安全連結點選
        |                 https進階點選
        |
-> iOS工具
CrashHlytics Crash統計工具
AFNetworking 和 ASIHttp
SDImage
TMCache

                AsyncDisplayKit 是 Facebook 推出的用於保持介面流暢性的框架
——————————————————————————————
參考文獻:《Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理》日本人寫的;
《Effective Objective C 2.0:編寫高質量iOS與OS X程式碼的52個有效方法》;
《Objective-C基礎教程(第2版)》        

網路部落格參考(無循序):念茜、南峰子、ibireme、容芳志、唐巧、王巍、董柏然、阮一峰、一片楓葉,王中周,頤和園等博主

參考的公眾帳號:《iOSDevTips》

 

完整的UIKit和Foundation 結構 <點選>

相關文章