RunTime簡稱運行時陪蜻,就是在運行時的一些機制慎陵,主要的就是消息機制(本質:任何方法的調用仲闽,本質上都是發(fā)送消息)脑溢,消息機制的原理,就是對象根據(jù)方法編號SEL去映射表里查找對應的方法實現(xiàn)
runtime庫里包含了跟類、成員變量屑彻、方法相關的API验庙,比如獲取類里面的所有成員變量,為類動態(tài)添加成員變量社牲,動態(tài)改變類的方法實現(xiàn)粪薛,為類動態(tài)添加新的方法需要導入<objc/message.h><objc/runtime.h>
是一套c語言的庫,實際上我們寫的oc代碼搏恤,最終都轉成了runtime庫的東西违寿,比如類轉成了ruemtime庫里的結構體等數(shù)據(jù)類型,方法轉成了runtime庫里的c語言函數(shù)熟空,平時調用方法都轉成了objc_msgSend函數(shù)(消息機制)
所以說藤巢,runtime是OC的底層的實現(xiàn),是OC的幕后執(zhí)行者
oc動態(tài)特性息罗,動態(tài)類型掂咒,動態(tài)綁定,動態(tài)加載
動態(tài)類型:動態(tài)調用方法迈喉,編譯的時候绍刮,類型匹配不能真正決定調用哪個函數(shù),只有在真正運行的時候挨摸,才會根據(jù)函數(shù)的名稱找到對應的函數(shù)來調用孩革。舉例來說,編譯階段得运,oc可以調用任何函數(shù)膝蜈,只要聲明了就可以,未實現(xiàn)也行
動態(tài)類型:程序直到運行時才能確定對象的類型 Animal *ani = [Dog new]; ?為了使用多態(tài)澈圈,父類指針指向子類對象彬檀, ? ?
靜態(tài)類型:程序在編譯的時候就知道了對象的類型,什么樣類型的指針指向什么樣類型的對象
編譯時檢查:在編譯的時候檢查是否正確,不正確瞬女,報錯不讓運行
運行時檢查:在運行的時候檢查窍帝,直接崩潰
a發(fā)送消息 方法調用的本質就是發(fā)送消息,方法調用轉化為使用運行時發(fā)送消息
實際應用:
Json到Model的轉化诽偷,用runtime提供的函數(shù)遍歷Model自身所有屬性坤学,如在json中有對應的值,則將其賦值
快速歸檔报慕,要對一些信息進行歸檔深浮,屬性有很多,用runtime提供的函數(shù)遍歷Model自身所有屬性眠冈,并對性encode和decode操作
訪問私有變量飞苇,這就要說菌瘫,OC中沒有真正意義上的私有變量和方法,要讓成員變量私有布卡,要放在m文件中聲明雨让,不對外暴露。如果我們知道這個成員變量的名稱忿等,可以通過runtime獲取成員變量栖忠,再通過getIvar來獲取它的值。
給分類添加屬性贸街,匿名分類中添加的是私有屬性庵寞,只在本類中可以使用,類的實例中不可以使用薛匪。頭文件中添加的在類的實例中也可以使用
方法交換
KVO的底層實現(xiàn)