block原理
OC block 是個結構體,內部有個一個結構體成員 專門保存 捕捉對象
Swift閉包 是個函數,捕獲了全局上下文的常量或者變量
修改數組存儲的內容,不需要加_block,修改數組對象本身時需要
weak原理
Weak 哈希表 (散列表),一個關鍵字 映射幾個存儲值,提高查詢效率,釋放時候遍歷釋放
引用計數retaincount的值 存在 isa指針中,過大會存在一個sidetable中
Isa指針是指向對象所屬類/元類的指針,每個對象都有一個isa指針
Weak會自動置為nil,unsafe unretain不會,容易出現野指針
category原理
category_t的結構體,存儲類名,方法列表
運行時添加方法,同名方法會存放在前面,導致執行時執行了category的方法
objc_msgSend(receiver, selector)
對象是動態類型,可以在運行時向對象發送消息,也就是某個方法沒有實現,編譯不會報錯。
根據isa指針 找到 實際所屬的類,然后在該類的方法列表 及 父類的方法列表,找到后運行,再最頂層父類找不到對應方法,則unrecognized selector 異常
類方法 其實在runtime 層還是實例方法
Runloop 是一個一直在執行的while循環,主線程默認開啟,子線程需要手動開啟,有3種源,執行時會判斷timer sourece0 source1,應用 基本的scroll滑動時,timer會停止,需要添加到runloop trackmode中。其他例如autoreleasepool 等一次runloop執行會釋放一次池,事件響應,手勢,UI更新,timer
Autoreleasepool大括號作用域結束后釋放,數據結構是個雙向鏈表
元類meta_class 作用
1、支持動態方法解析,當對象方法不存在時,嘗試從繼承鏈中查找/動態添加方法
2、支持類別,當類別擴展了類的功能時,元類負責管理類別的新增方法 及原有方法
3、完整對象和類的關系,是描述類的類
4、消息轉發機制的基礎,
class_copyIvarList所有屬性及大括號中的變量
class_copyPropertyList聲明的屬性
class_ro_t 類在編譯器確定的屬性 方法 協議,沒有分類的方法。只讀
class_rw_t 運行時生成的
KVO 原理
addObserver時,創建了新的子類,并將對象轉為新子類的對象,在新子類中添加willchange didchange方法
關閉autoNotifyObserver后,需要手動調will didchange觸發
函數返回一個對象時,會對對象 autorelease ,延長對象生命周期
懸垂指針- 只留下了指針,內存釋放了,指針沒釋放
五大區,棧(系統) 堆(程序) 靜態 字符串常量 代碼區
類別添加屬性,通過關聯對象,存儲在全局的一個哈希表中
performselector after 子線程中不起作用,原理是內部起了timer處理,而子線程中runloop默認沒有,timer就不起作用
Dispatch after 原理是延遲執行,而不是到達延遲時間后執行
檢測卡頓:
使用cadisplaylink監控FPS ,簡單直觀但無法定位堆棧
監聽runloop,閥值不好控制,能定位堆棧
Ping主線程,能定位堆棧,能記錄卡頓時間,閥值
反射:類 協議 selector
TCP/IP 五層協議 物理層 數據鏈路層 網絡層 傳輸層 應用層
大文件:邊下載邊存入本地,避免占用大內存 NSFileManager