1. 程式人生 > >【精】iOS知識樹,知識點(包括物件、Block、訊息轉發、GCD、執行時、runloop、動畫、Push、KVO、tableview,UIViewController、提交AppStore)

【精】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,這相當於對檢視進行了一次深拷貝

|       UIView事件擊穿,擴大按鈕響應區域,通過重寫hittest方法實現。點選
|->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的點選

||       如何判斷兩個物件相等,需要重寫isEqual:方法和hash方法。雖然hash是為了物件加入set或者你是NSArray時候用的。但是判斷兩個物件是否相等,可以先hash,如果hash都不一樣那麼肯定不一樣,接下來才是isEqual:方法的比較點選。使用hash只是提高判斷效率。

||       任何 Objective-C 都有 hash 方法,該方法返回一個 NSUInteger,是該物件的 hashCode單擊

||       任[self class]和 [super class]問題:self 是類的隱藏的引數,指向當前當前呼叫方法的類;super並不是隱藏的引數,它只是一個“編譯器指示符”,它和self指向的是相同的訊息接收者。所以兩者都指向本類。點選
        |                 |->NSString & NSMutableString
        |                    |       
NSString作為屬性時候,用copy還是strong修飾?如果只是NSString沒什麼copy和strong區別。
        |                    |      當NSString物件指向NSMutableString的時候,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會下發一個通知:UIApplication-SignificantTimeChangeNotification

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

|                    |-> 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點選
        |               

相關推薦

iOS知識知識點包括物件Block訊息轉發GCD執行runloop動畫PushKVOtableviewUIViewController提交AppStore

        本文旨在總結iOS知識網路,知識點,該知識網路羅列出常見UIKit、Foundation的物件特點和一些使用經驗,可以看成是一本書;文字編輯採用樹的形式,對知識點進行羅列,並標註一些使用經驗(★)希望對初學者有用或給一些解決疑難雜症者提供思路;某些知識點會深入

演算法紅黑插入資料變色左旋右旋

本人菜雞一隻,正在更新紅黑樹系列的文章。 該系列到現在暫只有3篇文章:   【演算法】紅黑樹(二叉樹)概念與查詢(一):https://blog.csdn.net/lsr40/article/details/85230703 【演算法】紅黑樹插入資料(變色,左旋、右旋)(二

iOS 日期操作總結:NSDateNSDateFormatter

1、日期(NSDate) ///////////////////////////////////////////////////////////////////////// // //(1)NSDate 初始化 // ////////////////////////////

演算法二叉遍歷層序

1.問題描述:    層序遍歷二叉樹; 2.分析:    用佇列實現,首先將頭節點加入佇列;如果佇列不為空,則執行如下操作:從佇列中取出元素輸出,若該元素的子節點不為空,則將其加入佇列。 3.程式碼實現:  void levelSort(TreeNode * pHead)

Javaitext根據模板生成pdf包括圖片和表格

金額 res report als fields positions 創建模板 bst open() 1、導入需要的jar包:itext-asian-5.2.0.jar itextpdf-5.5.11.jar。 2、新建word文檔,創建模板,將文件另存為pdf,並用Ado

洛谷P3402 模板可持久化並查集可持久化線段線段

std 樹節點 https case 深度 build eof spa 復雜度 orz TPLY 巨佬,題解講的挺好的。 這裏重點梳理一下思路,做一個小小的補充吧。 寫可持久化線段樹,葉子節點維護每個位置的fa,利用每次只更新一個節點的特性,每次插入\(logN\)個節點,

BZOJ3162獨釣寒江雪哈希動態規劃

const pac string fine bool names 1=1 max 題解 【BZOJ3162】獨釣寒江雪(樹哈希,動態規劃) 題面 BZOJ 題解 忽然翻到這道題目,突然發現就是前幾天一道考試題目。。。 題解: 樹哈希,既然只考慮這一棵樹,那麽,如果兩個點為根

演算法二叉前序中序後序遍歷相互求法

二叉樹前序、中序、後序遍歷相互求法 原文地址      今天來總結下二叉樹前序、中序、後序遍歷相互求法,即如果知道兩個的遍歷,如何求第三種遍歷方法,比較笨的方法是畫出來二叉樹,然後根據各種遍歷不同的特性來求,也可以程式設計求出,下面我們分別說明。  

BZOJ 1211 1211: [HNOI2004]的計數 prufer序列計數

1211: [HNOI2004]樹的計數 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一個有n個結點的樹,設它的結點分別為v1, v2, …, vn,已知第i個結點vi的度數為di,問滿足這樣

iOS知識知識點

|                    |-> NSURLConnection iOS9已不再使用 |                    |-> NSURLSession & NSURLSessionTask 【點選】NSURLSession提供的功能: |          

Poj-A Simple Problem with Integers線段區間更新

A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 100877 Accepted: 31450 Case Time Limit: 2

原創二叉的建立與遍歷前序遍歷中序遍歷後序遍歷

二叉樹的建立與遍歷(binary-tree) 題目描述 給出一棵二叉樹,分別輸出先序、中序、後序遍歷結果。 輸入 第一行:結點數n(1<=n<=100)。 以下n行,每行3個整數,分別表

面試吃透了這些Redis知識點面試官一定覺得你很NB乾貨 | 建議珍藏

是資料結構而非型別   很多文章都會說,redis支援5種常用的資料型別,這其實是存在很大的歧義。redis裡存的都

演算法二叉N叉先序中序後序BFSDFS遍歷的遞迴和迭代實現記錄Java版

        本文總結了刷LeetCode過程中,有關樹的遍歷的相關程式碼實現,包括了二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現。這也是解決樹的遍歷問題的固定套路。 一、二叉樹的先序、中序、後序遍歷  1、遞迴模板  (1)

模板左偏可並堆

inline 限制 需要 表示 開始 cnblogs -a 刪除 ont 題目描述 如題,一開始有N個小根堆,每個堆包含且僅包含一個數。接下來需要支持兩種操作: 操作1: 1 x y 將第x個數和第y個數所在的小根堆合並(若第x或第y個數已經被刪除或第x和第y個數在

面試iOS 開發面試題(一

readonly ava obj jce easy 主動 每一個 我不 com   1. #import 跟#include 又什麽差別,@class呢, #import<> 跟 #import””又什麽差別?   答:#import是Obje

紅黑 ------ luogu P3369 模板普通平衡Treap/SBT

div child lin main false tchar clas char als 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) 近幾天閑來無事。。。就把各種平衡樹都寫了一下。。。 下面是紅黑樹(Red Black Tree)

替罪羊 ------ luogu P3369 模板普通平衡Treap/SBT

nod %d clas https number problem 普通 true ble 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) 閑的沒事,把各種平衡樹都寫寫 比較比較。。。 下面是替罪羊樹 #include &l

數組splay ------ luogu P3369 模板普通平衡Treap/SBT

普通 模板 char truct div color fine col suffix 二次聯通門 : luogu P3369 【模板】普通平衡樹(Treap/SBT) #include <cstdio> #define Max 100005

P3391 模板文藝平衡Splay

spa 標題 -s gets 需要 () 序列 代碼 輸入 題目背景 這是一道經典的Splay模板題——文藝平衡樹。 題目描述 您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:翻轉一個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2