UITableView 經過重用單元格來達到節省內存的目的: 經過爲每一個單元格指定一個重用標識符,即指定了單元格的種類,當屏幕上的單元格滑出屏幕時,系統會把這個單元格添加到重用隊列中,等待被重用,當有新單元格從屏幕外滑入屏幕內時,從重用隊列中找看有沒有能夠重用的單元格,若是有,就拿過來用,若是沒有就建立一個來使用。程序員
UITapGestureRecognizer,UISwipeGestureRecognizer是一次性手勢,手勢發生後,響應只會執行一次。web
SDWebImage 中爲 UIImageView 提供了一個分類UIImageView+WebCache.h, 這個分類中有一個最經常使用的接口sd_setImageWithURL:placeholderImage:,會在真實圖片出現前會先顯示佔位圖片,當真實圖片被加載出來後再替換佔位圖片。編程
加載圖片的過程大體以下:
1.首先會在 SDWebImageCache 中尋找圖片是否有對應的緩存, 它會以url 做爲數據的索引先在內存中尋找是否有對應的緩存
2.若是緩存未找到就會利用經過MD5處理過的key來繼續在磁盤中查詢對應的數據, 若是找到了, 就會把磁盤中的數據加載到內存中,並將圖片顯示出來
3.若是在內存和磁盤緩存中都沒有找到,就會向遠程服務器發送請求,開始下載圖片
4.下載後的圖片會加入緩存中,並寫入磁盤中
5.整個獲取圖片的過程都是在子線程中執行,獲取到圖片後回到主線程將圖片顯示出來瀏覽器
SDWebImage原理:
調用類別的方法:
1. 從內存(字典)中找圖片(當這個圖片在本次使用程序的過程當中已經被加載過),找到直接使用。
2. 從沙盒中找(當這個圖片在以前使用程序的過程當中被加載過),找到使用,緩存到內存中。
3. 從網絡上獲取,使用,緩存到內存,緩存到沙盒。緩存
AFNetworking主要是對NSURLSession和NSURLConnection(iOS9.0廢棄)的封裝,其中主要有如下類:
1). AFHTTPRequestOperationManager:內部封裝的是 NSURLConnection, 負責發送網絡請求, 使用最多的一個類。(3.0廢棄)
2). AFHTTPSessionManager:內部封裝是 NSURLSession, 負責發送網絡請求,使用最多的一個類。
3). AFNetworkReachabilityManager:實時監測網絡狀態的工具類。當前的網絡環境發生改變以後,這個工具類就能夠檢測到。
4). AFSecurityPolicy:網絡安全的工具類, 主要是針對 HTTPS 服務。
5). AFURLRequestSerialization:序列化工具類,基類。上傳的數據轉換成JSON格式
(AFJSONRequestSerializer).使用很少。
6). AFURLResponseSerialization:反序列化工具類;基類.使用比較多:
7). AFJSONResponseSerializer; JSON解析器,默認的解析器.
8). AFHTTPResponseSerializer; 萬能解析器; JSON和XML以外的數據類型,直接返回二進
制數據.對服務器返回的數據不作任何處理.
9). AFXMLParserResponseSerializer; XML解析器;安全
1). 正確的複用cell。
2). 設計統一規格的Cell
3). 提早計算並緩存好高度(佈局),由於heightForRowAtIndexPath:是調用最頻繁的方法;
4). 異步繪製,遇到複雜界面,遇到性能瓶頸時,可能就是突破口;
4). 滑動時按需加載,這個在大量圖片展現,網絡加載的時候很管用!
5). 減小子視圖的層級關係
6). 儘可能使全部的視圖不透明化以及作切圓操做。
7). 不要動態的add 或者 remove 子控件。最好在初始化時就添加完,而後經過hidden來控制是否顯示。
8). 使用調試工具分析問題。服務器
若是但願每條數據顯示自身的行高,必須設置兩個屬性,1.預估行高,2.自定義行高。
設置預估行高 tableView.estimatedRowHeight = 200。
設置定義行高 tableView.estimatedRowHeight = UITableViewAutomaticDimension。
若是要讓自定義行高有效,必須讓容器視圖有一個自下而上的約束。網絡
簡單說,你瀏覽的網頁(網址以http://開頭)都是http協議傳輸到你的瀏覽器的, 而http是基於socket之上的。socket是一套完整tcp,udp協議的接口。 HTTP協議:簡單對象訪問協議,對應於應用層 ,HTTP協議是基於TCP鏈接的 tcp協議: 對應於傳輸層 ip協議: 對應於網絡層 TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。 Socket是對TCP/IP協議的封裝,Socket自己並非協議,而是一個調用接口(API),經過Socket,咱們才能使用TCP/IP協議。 http鏈接:http鏈接就是所謂的短鏈接,即客戶端向服務器端發送一次請求,服務器端響應後鏈接即會斷掉; socket鏈接:socket鏈接就是所謂的長鏈接,理論上客戶端和服務器端一旦創建起鏈接將不會主動斷掉;可是因爲各類環境因素可能會是鏈接斷開,好比說:服務器端或客戶端主機down了,網絡故障,或者二者之間長時間沒有數據傳輸,網絡防火牆可能會斷開該鏈接以釋放網絡資源。因此當一個socket鏈接中沒有數據的傳輸,那麼爲了維持鏈接須要發送心跳消息~~具體心跳消息格式是開發者本身定義的 1)Socket是一個針對TCP和UDP編程的接口,你能夠藉助它創建TCP鏈接等等。而TCP和UDP協議屬於傳輸層 。 而http是個應用層的協議,它實際上也創建在TCP協議之上。 (HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。) 2)Socket是對TCP/IP協議的封裝,Socket自己並非協議,而是一個調用接口(API),經過Socket,咱們才能使用TCP/IP協議。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而造成了咱們知道的一些最基本的函數接口。
創建Socket鏈接至少須要一對套接字,其中一個運行於客戶端,稱爲ClientSocket ,另外一個運行於服務器端,稱爲ServerSocket 。 套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。 1。服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態,等待客戶端的鏈接請求。 2。客戶端請求:指客戶端的套接字提出鏈接請求,要鏈接的目標是服務器端的套接字。爲此,客戶端的套接字必須首先描述它要鏈接的服務器的套接字,指出服務器端套接字的地址和端口號,而後就向服務器端套接字提出鏈接請求。 3。鏈接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求時,就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式創建鏈接。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。
多態。 主要是將數據類型的肯定由編譯時,推遲到了運行時。
簡單來講,運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。異步
id能夠指向任何類型的指針 或 指向任何未知類型的指針。
instancetype只能做爲返回值,不能像id那樣做爲參數socket
答案都是收集而來,若是有什麼錯誤,歡迎指正!