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

        本文旨在總結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:

                             |            Can't add self as subview 這個crash是由於快速push兩個UIViewController導致的【點擊】
                             |         一次dissmiss多個 present controller
                                   |                UIViewController *rootVC = self.presentingViewController;
                                   |                while (rootVC.presentingViewController) 
                                   |                    rootVC = rootVC.presentingViewController;
                                   |                [rootVC dismissViewControllerAnimated:YES completion:nil];
                                   |        ★pop到rootcontroller    [UINavigationController popToRootViewControllerAnimated:]

                             |        還有一種:直接把Controller的view添加到另一個Controller上。
                             |-> UIView
                             |        
frame 和bound 的區別點擊
                             |            frame 是相對父試圖座標的值; bound是本身座標系統的值                            
                             |        
layoutSubviews點擊 需要將[super layoutSubviews];放到最後,不然iOS7有可能會有這個崩潰
                             |                 "Auto Layout still required after executing -layoutSubviews” iOS7上崩潰sdk缺陷 點擊

                             |                layoutSubviews在以下情況下會被調用:
                             |                1、init初始化不會觸發layoutSubviews。
                             |                2、addSubview會觸發layoutSubviews。
                             |                3、設置view的Frame會觸發layoutSubviews,當然前提是frame的值設置前後發生了變化。
                             |                4、滾動一個UIScrollView會觸發layoutSubviews。
                             |                5、旋轉Screen會觸發父UIView上的layoutSubviews事件。
                             |                6、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。
                             |                7、直接調用setLayoutSubviews。
                             |        每一個視圖有唯一的父視圖點擊。addsubview操作把它從上一個父試圖中移除
                             |        善於使用hidden 使用animateWithDuration簡單地控制頁面切換效果
                             |        使用animateWithDuration簡單地控制頁面切換效果點擊
                             |        簡單動畫 animateWithDuration點擊

                             |        因爲UIView沒有實現copy協議,因此找不到copyWithZone方法,使用copy的時候導致崩潰,但是我們可以通過歸檔再解檔實現copy,這相當於對視圖進行了一次深拷貝
                             |->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)];
                            
                             |           ★  設置行間距,通過設置label的attributedText來實現

                          /    
        /-> UIKit 
        |                 \                  
        |                    |-> UIButton

        |                    |            設置顏色,文字一定要指定button狀態
        |                    |            善於使用contentEdgeInsets,imageEdgeInsets titleEdgeInsets可以設置文本邊距點擊
        |                    |            設置圓角可layer.cornerRadius

        |                    |            UIButton 設置 imageView frame是無法改變大小的,大小就是圖片的大小【點擊】
        |                    |            設置button上的title左對齊。僅僅設置label是沒用的,需要:

        |                    |            ★ btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

        |                    |            去掉系統的按下高亮置灰效果 [btn setAdjustsImageWhenHighlighted:NO];

        |                    |-> UITextfield 
        |
                    |        隱藏鍵盤,[textfield resignFirstResponder]
        |                    |        ★ 任意頁面隱藏鍵盤點擊
        |                    |-> UIScrollerView
        |
                    |        上拉下拉原理點擊

        |                    |        Apple不建議在UIScrollerView上添加UITableview Important: You should not embed UIWebView or UITableView objects in UIScrollView objects. If you do so, unexpected behavior can result because touch events for the two objects can be mixed up and wrongly handled.
        |                    |-> UITableView
        |
                    |        複用,注意重寫 - (void)prepareForReuse

        |                    |        ★ 在-(void)layoutSubviews中設置subview的frame。否則frame總是(320,44)
        |                    |        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 在更改dataSource後需要立即調用reloadData,否則只要UI有刷新必crash。
        |                    |        tableView 在調用reloadData後,短時間內不要更改dataSource,尤其是將dataSource清空,否則只要ui有刷新必crash
        |                    |        tableView正在滾動的時候,如果reloadData,偶爾發生App crash的情況點擊
        |                    |        UITableview Deceleration 加速滑動(慣性滑動)、彈性迴歸原理點擊

        |                    |        UITableview 刷新某一個cell 或 section點擊
        |                    |        UITableview 上拉隱藏搜索框,下拉出現搜索框點擊
        |                    |        UITableview 是在willDisplayCell: 還是在cellForRowAtIndexPath: update data 呢?【點擊】
        |                    |        UITableview UITableViewStylePlain模式,header不浮動點擊

        |                    |        UITableview 當tableview的section比較多時候,內容也比較複雜,比如設計多個http接口。在更新tableview的時候一定要注意清除舊數據
        |                    |-> UITableViewCell 
        |                    |        UITableViewCell changes the background color of all sub views when cell is selected or highlighted.意思就是說當UITableViewCell被選中或者高亮的時候,它的所有子view的顏色都會改變。
        |                    |       所以建議一般設置cell.selectionStyle = UITableViewCellSelectionStyleNone;

        |                    |-> UIDevice
        |                    
|        設備名 [UIDevice currentDevice].name,
        |                    |        系統版本號 [[UIDevice currentDevice].systemVersion doubleValue]; 點擊
        |                    |        屏幕旋轉方向 [[UIDevice currentDevice] orientation]
        |                    |        區分iPad還是iPhone [UIDevice currentDevice].userInterfaceIdiom);
        |                    |-> UIScreen
        | 
                   |        如何正確的繪製1像素的線點擊
        |                    |        保證邊距不變,內容等比例拉伸點擊
        |                    |-> UIEdgeInsets
        |                    |       
實際顯示邊距,跟設置邊距的距離點擊
        |                    \->自動佈局
        |                             
Masonry 高級一點用法【多個label,可變長情況下使用Masonry】點擊
        |                             storyboard

        |                             在autolayout之前還有一種技術叫autoresizingmask,功能少一些。兄弟視圖之間約束比較費勁
        |
        |                    /-> 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程序時對日期處理的總結點擊
        |                    |           當新的一天來到,或者說當運營商時間更新的時候,UIApplication會下發一個通知:UIApplicationSignificantTimeChangeNotification

        |                    |           當系統的區域格式,或者時間格式(是否24小時制)改變時,下發通知:NSCurrentLocaleDidChangeNotification

        |                    |-> NSCoding & NSCoder 僅有的兩個方法,數據的序列號和反序列化點擊       
        |                    |            - (void)encodeWithCoder:(NSCoder *)aCoder;
        |                    |            - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
        |                    |-> NSCopying & NSZone
        |                    |          + (instancetype)allocWithZone:深拷貝,類似於memcpy這樣的C方法點擊
        |                    |-> NSAutoreleasePool
        |                    |          降低內存峯值點擊

        |                    |          在Runloop休眠前(kCFRunLoopBeforeWaiting)時候釋放自動釋放池中的對象
        |                    |-> 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 現在都用masonry
        |                    |-> 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,都是類似的機制。
        |                            |        放在下一個runloop執行,保證當前執行正確【點擊】
        |                            |       Runnloop基本作用  點擊
        |                            |        ·保持程序的持續運行(比如主運行循環)
        |                            |        ·處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)
        |                            |        ·節省CPU資源,提高程序性能:該做事時做事,該休息時休息
        |                            |       Runnloop應用
        |                            |        ·NSTimer 默認是NSDefaultRunLoopMode,滑動時候定時器不計時
        |                            |        ·ImageView顯示 當用戶在拖拽時(UI交互時)不顯示圖片,拖拽完成時顯示圖片
        |                            |        ·PerformSelector  設置運行模式
        |                            |        ·常駐線程 經常在後臺進行耗時操作,如:監控聯網狀態,掃描沙盒等 不希望線程處理完事件就銷燬,保持常駐狀態
        |                            |        ·自動釋放池 在休眠前(kCFRunLoopBeforeWaiting)進行釋放,處理事件前創建釋放池,中間創建的對象會放入釋放池

        |                            |       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  
        
|                 建立安全鏈接

        |                         之前做過一段IM,對基本建立安全鏈接略知一二點擊
        |                 HTTPS進階點擊】【本人總結
        |                         一句話概括https的ssl加密過程:整個加密過程涉及:非對稱加密和對稱加密兩種技術,其中非對稱加密

        |                         (由於RSA計算速度特別慢,無法對大量信息加密)用於簡歷安全鏈接,確保server和客戶端
        |                          的合法(這需要證書機制);對稱加密,則基於剛剛的安全鏈接之上,對傳輸內容的加密(加密速度很快)

        |                         整個過程需要4次握手
        |
        \-> iOS工具
轉屏。APP本身是豎屏,但是某一個頁面需要橫屏點擊
                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》即唐巧的公衆帳號;《iOSDevTip》


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章