iOS知識樹,知識點(包括對象、Block、消息轉發、GCD、運行時、runloop、動畫、Push、KVO、tableview,UIViewController、提交AppStore)

    /->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 加速滑動(慣性滑動)、彈性迴歸原理【點擊
        |                    |        UITableview 刷新某一個cell 或 section【點擊
        |                    |        UITableview 上拉隱藏搜索框,下拉出現搜索框【點擊
        |                    |-> 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中。【點擊】php

        |                    |-> 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         
        |               \
        |                    |
       
★ iOS六、七、八、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有三種多線程編程的技術,分別是:【點擊
        |                 一、NSThread 下面會講到
        |                 二、Cocoa NSOperation 下面會講到
        |                 三、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的方法列表中查找。html

        |                            |        ★繼承體系【點擊
        |
                            |        動態建立類【點擊
        |                            |            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版)》        ios

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

參考的公衆賬號:《iOSDevTips》即唐巧的公衆賬號;《iOSDevTip》程序員

相關文章
相關標籤/搜索