標籤:
首先聲明 轉載的 不過忘了地址在哪將就看吧
數組中的指標 int array[3] = {11,22,33}
&array[0] 可看做是一個指標,指向array[0],指向int類型的資料(4個位元組的資料)
array 可看做是一個指標:指向array[0], 同價與&array[0]
&array 可看做是一個指標,指向array 數組,array[3] 就是12個位元組的資料
static的使用
修飾局部變數,修改的是生命週期
static修飾的局部變數,在整個程式運行過程中,只初始化一次,而且只有一份記憶體
static修飾的局部變數,並沒有改變範圍
修飾全域變數,修改的是範圍
沒有被static修飾的全域變數,項目中的任何檔案,可以訪問
static修飾的全域變數,只在當前檔案中訪問
const 與define使用的區別
define修飾的變數不指定類型,const的指定類型
defien修飾的變數每次引用都開闢一次記憶體,而const只有一份記憶體
如果修飾的是程式碼片段適合用define,如果修飾的是變數適合用const
isMemberOfClass 和 isKindOfClass 的聯絡和區別
聯絡:兩者都能檢測一個對象是不是某個類的成員
區別:isKindOfClass不僅能確定一個對象是不是某個類的成員,也能確定一個對象是否是派生自該類的類的成員,而isMemberOfClass只能做到前者.
assign,retain,copy 的區別
assign:普通賦值,一般常用於基礎資料型別 (Elementary Data Type),常見委託設計模式,防止循環參考.(我們稱之為弱引用)
retain:獲得對象的所有權,引用計數在原有計數的基礎上加1.
copy: 一般認為,是在記憶體中重新開闢了一個新的記憶體空間,用來儲存新的對象,和原來的對象是兩個不同的地址,引用計數分別為1。但是當copy對象為不可變對象時,那麼copy 的作用相當於retain。因為,這樣可以節約記憶體空間
nil, Nil,NULL 與 NSNull 的區別
nil 指向一個對象的指標為空白,在objc.h 的定義如下: NSString *name = nil;
Nil 指向一個類的指標為空白,定義如下: Class aClass = Nil;
NULL 指向C類型的指標為空白, 例如: int*pInt = NULL;
NSNull 在Objective-C中是一個類,只是名字中有個Null,多用於集合(NSArray,NSDictionary)中值為空白的對象
多線程
多線程原理
同一時間,CPU只能處理1條線程,多線程並發執行,其實是CPU快速地在多條線程之間調度
線程非常多的危害: CPU在N多個線程之間調度,CPU會累死,消耗大量的CPU資源
每條線程被調度執行的頻次會降低(線程的執行效率降低)
多線程的實現方案
pthread一套通用的多線程API,適用於Unix/Linux/Windows等系統,跨平台\可移植,使用難度大, C語言,程式員管理生命週期,項目中幾乎不用
NSThread使用更加物件導向,簡單易用,可直接操作, OC語言,程式員管理生命週期,項目中偶爾使用
GCD旨在替代NSThread等線程技術,充分利用裝置的多核,C語言,自動管理生命週期,項目中經常使用 NSOperation基於GCD(底層是GCD),比GCD多了一些簡單實用的功能,使用更加物件導向, OC語言,自動管理生命週期,項目中經常使用
多線程的安全隱患
資源共用,1塊資源可能會被多個線程共用,比如多個線程訪問同一個對象,同一個變數,同一個檔案
安全隱患解決--互斥鎖
互斥鎖使用格式 @synchronized(鎖對象){//需要鎖定的代碼}
互斥鎖的優缺點
優點:能有效防止因多線程搶奪資源引起的資料安全問題
缺點:需要消耗大量的CPU資源
相關專業術語:線程同步,多條線程在同一條線上執行(按順序地執行任務)
補充
OC在定義屬性的時有nonatomic和atomic兩種選擇
atomic:原子屬性,為setter方法加鎖(預設是atomic),安全執行緒,需要消耗大量的資源
nonatomic:非原子屬性,不會為setter方法加鎖,非安全執行緒,適合記憶體小的行動裝置
GCD
全稱Grand Central Dispatch"牛逼的中樞調度器"
多核的並行運行,自動管理線程的生命週期(建立線程,調度任務,銷毀任務)
CGD 2個核心概念:
任務執行什麼操作,隊列用來存放任務
將任務添加到隊列中,CGD會自動講隊列中的任務取出,放到對應的線程中執行
同步和非同步主要影響:能不能開啟新的線程
同步:只在當前線程中執行任務,不具備開啟新線程的能力
非同步:可以在新的線程中執行任務,具備開啟新線程的能力
TCP 和UDP 的區別與聯絡
TCP 為傳輸控制層協議,為連線導向,可靠的,點到點的通訊
UDP 為使用者資料包通訊協定,非串連的不可靠的點到多點的通訊
TCP 側重可靠傳輸,UDP 側重快速傳輸
網路層協議
應用程式層:
使用者介面、應用程式;
Application典型裝置:網關;
典型協議、標準和應用:TELNET、FTP、HTTP
展示層:
資料表示、壓縮和加密presentation
典型裝置:網關
典型協議、標準和應用:ASCLL、PICT、TIFF、JPEG|MPEG
展示層相當於一個東西的表示,表示的一些協議,比片、聲音和視頻MPEG。
會話層:
會話的建立和結束;
典型裝置:網關;
典型協議、標準和應用:RPC、SQL、NFS、X WINDOWS、ASP
傳輸層:
主要功能:端到端控制Transport;
典型裝置:網關;
典型協議、標準和應用:TCP、UDP、SPX
網路層:
主要功能:路由、定址Network;
典型裝置:路由器;
典型協議、標準和應用:IP、IPX、APPLETALK、ICMP;
資料連結層:
主要功能:保證無差錯的疏忽鏈路的data link;
典型裝置:交換器、橋接器、網卡;
典型協議、標準和應用:802.2、802.3ATM、HDLC、FRAME RELAY;
物理層:
主要功能:傳輸位元流Physical;
典型裝置:集線器、中繼器
典型協議、標準和應用:V.35、EIA/TIA-232.
TCP 三向交握
第一次握手:用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包,即SYN+ACK包,此時伺服器進入SYN+RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三次狀態。
Socket 連結和 HTTP 連結
HTTP協議是基於TCP串連的,是應用程式層協議,主要解決如何封裝資料。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/IP協議。 HTTP串連:短串連,用戶端向伺服器發送一次請求,伺服器響應後串連斷開,節省資源。伺服器不能主動給用戶端響應(除非採用HTTP長串連技術),iPhone主要使用類NSURLConnection。
Socket串連:長串連,用戶端跟伺服器端直接使用Socket進行串連,沒有規定串連後斷開,因此用戶端和伺服器段保持串連通道,雙方可以主動發送資料,一般多用於遊戲.Socket預設連線逾時時間是30秒,預設大小是8K(理解為一個資料包大小)。
HTTP協議,get 與 post 的區別
POST請求:參數在請求資料區放著,相對GET請求更安全,並且資料大小沒有限制。把提交的資料放置在HTTP包的包體中.
GET請求:參數在地址後拼接,沒有請求資料,不安全(因為所有參數都拼接在地址後面),不適合傳輸大量資料(長度有限制,為1024個位元組)。
HTTPS:安全超文字傳輸通訊協定 (HTTPS)(Secure Hypertext Transfer Protocol),它是一個安全通訊通道,基於HTTP開發,用於客戶電腦和伺服器之間交換資訊,使用安全套結字層(SSI)進行資訊交換,即HTTP的安全版。
網路訊息推送
一種是Apple自己提供的通知伺服器(APNS伺服器),一種是用第三方推送機制
首先,系統彈出提示框詢問使用者是否允許,當使用者允許後向蘋果伺服器(APNS)請求deviceToken,並由蘋果伺服器發送給自己的應用,自己的應用將deviceToken以及想要推送的資訊發送給蘋果伺服器,蘋果伺服器將資訊發送給應用
推送資訊內容,總容量不超過356位元組
loadview , viewDidLoad, viewdidUnload 的關係
第一次訪問UIViewController的view時,view為nil,然後就會調用loadview方法建立view
view建立完畢後會調用viewDidLoad方法進行介面元素的初始化
當 記憶體警告時,系統可能會釋放UIViewController的view,將view賦值為nil,並且調用viewDidUnload方法
當再次訪問UIViewController的view時,view已經被賦值為nil,所以又會調用loadview方法重建view
view被重新建立完畢後,還是會調用viewDidLoad方法進行介面元素的初始化
load 和 initialize 的區別
共同點:
在不考慮開發人員主動使用的情況下,系統最多會調用一次,如果父類和子類都被調用,父類的調用一定在子類之前,都是為了應用運行提前建立合適的運行環境,在使用時都不要過重地依賴於這兩個方法,除非真正必要.
區別:
load方法調用時機比較早,運行環境有不確定因素。具體說來,在iOS上通常就是App啟動時進行載入,但當load調用的時候,並不能保證所有類都載入完成且可用,必要時還要自己負責做auto release處理。對於有依賴關係的兩個庫中,被依賴的類的load會優先調用。但在一個庫之內,調用順序是不確定的。 補充
對於一個類而言,沒有load方法實現就不會調用,不會考慮對NSObject的繼承。 一個類的load方法不用寫明[super load],父類就會收到調用,並且在子類之前。 Category的load也會收到調用,但順序上在主類的load調用之後。 不會直接觸發initialize的調用。
iOS冷知識