面試聊iOS:RunTime(一)

大家好吁恍,我是面試聊iOS的程序員锅锨。
這篇文章將和大家分享面試iOS時聊RunTime一般都可以聊些什么雕欺。

抖音搜索 面試聊iOS 觀看視頻版


相關文章鏈接
面試聊iOS:內存管理
面試聊iOS:RunTime(一)
面試聊iOS:RunTime(二)
面試聊iOS:Block
面試聊iOS:多線程
面試聊iOS:RunLoop
面試聊iOS:性能優(yōu)化


OC是一門動態(tài)語言

動態(tài)語言是指程序可以在運行時可以改變其結構:添加新的函數富雅、屬性蒲犬,刪除已有的函數宜狐、屬性等結構上的變化势告,在運行時做類型的檢查。

編譯時:源代碼被編譯成機器可以識別的代碼的過程抚恒。
運行時:用戶可以運行編譯過的程序咱台,程序運行的過程。

OC的動態(tài)性由runtime支持的俭驮。
runtime是一個C語言的庫回溺,提供API創(chuàng)建類、添加方法混萝、刪除方法遗遵、交換方法等。


id逸嘀、instanceType

id

使用id修飾的對象是動態(tài)類型车要,只是簡單的聲明了指向對象的指。
編譯時不做類型檢查崭倘,可以發(fā)送任何信息給id類型的對象

instanceType

表示某個方法返回未知類型的OC對象
非關聯類型的方法返回所在類的類型

instancetype可以返回和方法所在類相同類型的對象翼岁,id只能返回未知類型的對象
instancetype只能作為返回值,不能像id一樣作為參數

關聯返回類型
  1. 類方法中司光,以alloc登澜、new開頭
  2. 實例方法中,以autorelease飘庄、init、retain购撼、或self開頭
    當方法的返回值為id類型跪削,方法不會返回一個類型不明的對象,會返回一個方法所在類類型的對象迂求。
非關聯返回類型
  1. 類方法中碾盐,不以alloc、new開頭
  2. 實例方法中揩局,不以autorelease毫玖、init、retain、或self開頭
    當方法的返回值為id付枫,方法會返回一個類型不明的對象烹玉;可以用instancetype作為方法的返回值的類型,返回一個方法所在類類型的對象阐滩。
NSObject *

聲明類指向NSObject類型對象的指針二打,編譯時要做類型檢查
NSObject是OC中的基類,絕大多數類都繼承與NSObject

id<NSObject>

也是一個指針掂榔,要求指向的類型要實現NSObject protocol
NSObject继效、NSProxy類實現了NSObject接口,id<NSObject>可以指向它們

OC對象的本質

OC對象本身是一個結構體装获,這個結構體只有一個isa指針
任何數據結構瑞信,只要在恰當的位置有個指針指向一個class,那么它就可以被認為是一個對象穴豫。

NSObject對象內存大小

64bit下凡简,bool、signed char绩郎、unsigned char 占1個字節(jié)潘鲫;
short、unsigned short 占2個字節(jié)肋杖,int溉仑、unsigned int、float占4個字節(jié)状植;
long浊竟、unsigned long、 long long津畸、double占8個字節(jié)振定。
NSObject占8個字節(jié)
結構體內成員按自身長度自對齊
對象內存申請的時候按8字節(jié)對齊,開辟內存時按16字節(jié)對齊


isa指針(is a what?)

objc_object *id;

struct objc_object {
  Class isa;
?}

objc_class *Class;

struct objc_class {
  super_class,
  name,
  version,
  info,
  instance_size,
  ivars,
  methodLists,
  cache,
  protocols
}
isa指向流程

實例對象isa指向類對象
類對象isa指向元類
類對象superClass指向父類指向的類對象
所有元類isa指向NSObject對象的元類(根元類)
根元類isa指向自己
根元類的superClass指向NSObject的類對象
元類的superClass指向對應父類的元類


消息發(fā)送機制

在OC中肉拓,對象調用方法其實是對象接收消息后频,消息的發(fā)送采用“動態(tài)綁定”的機制,具體調用哪個方法知道運行時才能確定暖途,確定后才會去執(zhí)行綁定的代碼

OC對象調用方法在運行時會被轉化為 void objc_msgSend(id self, SEL cmd...)

SEL:方法名?IMP:指向方法實現的函數指針

消息發(fā)送流程
  1. 根據消息接收者的isa確定自己所屬的類卑惜,先在類的_x001D_cache和MethodLists中從上向下查找IMP;
  2. 如果本類中沒有找到驻售,則會根據本類的superClass指針露久,沿著繼承體系繼續(xù)向上查找(向父類查找);
  3. 如果向父類查找都沒有找到欺栗,則會進入消息轉發(fā)流程
消息轉發(fā)流程
  1. 動態(tài)解析
+ (BOOL)resolveInstanceMethod:(SEL)selector;
+ (BOOL)resolveIClassMethod:(SEL)selector;
  1. 備用接收者
- (id)forwardingTargetForSelector:(SEL)selector;
  1. 消息重定向
- (void)forwardInvocation:(NSInvocation *)anInvocation毫痕;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector征峦;

最后消息未能處理的時候,還會調用

- (void)doesNotRecognizeSelector:(SEL)aSelector拋出異常

Method Swizzing(方法交換)

Method Swizzing是發(fā)生在運行時的消请,主要用于在運行時將兩個Method進行交換.

先給要替換的方法的類添加一個Category栏笆,然后在Category中的+(void)load方法中添加Method Swizzling方法,我們用來替換的方法也寫在這個Category中梯啤。

Swizzling應該總在+load中執(zhí)行竖伯,load類方法是程序運行時這個類被加載到內存中就調用的一個方法,執(zhí)行比較早因宇,并且不需要我們手動調用

Swizzling應該總是在dispatch_once中執(zhí)行七婴,避免被多次執(zhí)行

Method Swizzing應用
  1. 頁面統(tǒng)計
    交換controller view的生命周期方法

  2. 事件統(tǒng)計、防止按鈕短時間內重復點擊
    交換UIControl sendAction:to:forEvent方法

  3. 交換delegate的方法
    hook setDelegate方法察滑,最好加上是否實現了delegate的方法的判斷

  4. 防止數組越界崩潰
    hook objectAtIndex打厘,需要獲取到類簇的真身

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贺辰,隨后出現的幾起案子户盯,更是在濱河造成了極大的恐慌,老刑警劉巖饲化,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莽鸭,死亡現場離奇詭異,居然都是意外死亡吃靠,警方通過查閱死者的電腦和手機硫眨,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巢块,“玉大人礁阁,你說我怎么就攤上這事∽迳荩” “怎么了姥闭?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長越走。 經常有香客問我棚品,道長,這世上最難降的妖魔是什么廊敌? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任南片,我火速辦了婚禮,結果婚禮上庭敦,老公的妹妹穿的比我還像新娘。我一直安慰自己薪缆,他們只是感情好秧廉,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布伞广。 她就那樣靜靜地躺著,像睡著了一般疼电。 火紅的嫁衣襯著肌膚如雪嚼锄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天蔽豺,我揣著相機與錄音区丑,去河邊找鬼。 笑死修陡,一個胖子當著我的面吹牛沧侥,可吹牛的內容都是我干的。 我是一名探鬼主播魄鸦,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宴杀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拾因?” 一聲冷哼從身側響起旺罢,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绢记,沒想到半個月后扁达,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蠢熄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年跪解,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片护赊。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡惠遏,死狀恐怖,靈堂內的尸體忽然破棺而出骏啰,到底是詐尸還是另有隱情节吮,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布判耕,位于F島的核電站透绩,受9級特大地震影響,放射性物質發(fā)生泄漏壁熄。R本人自食惡果不足惜帚豪,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一欠母、第九天 我趴在偏房一處隱蔽的房頂上張望疫鹊。 院中可真熱鬧底扳,春花似錦俗壹、人聲如沸睛榄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唧垦。三九已至,卻和暖如春煤禽,著一層夾襖步出監(jiān)牢的瞬間铐达,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工檬果, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓮孙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓选脊,卻偏偏與公主長得像杭抠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子知牌,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 大家好祈争,我是面試聊iOS的程序員。這篇文章將和大家分享面試iOS時聊RunTime一般都可以聊些什么角寸。 視頻版:抖...
    面試聊iOS閱讀 548評論 0 2
  • RunTime簡稱運行時菩混。OC就是運行時機制,也就是在運行時候的一些機制扁藕,其中最主要的是消息機制沮峡。 對于C語言,函...
    暮年古稀ZC閱讀 668評論 0 1
  • 一. RunTime簡介 RunTime簡稱運行時亿柑。OC就是運行時機制邢疙,也就是在運行時候的一些機制,其中最主要的是...
    iOS鑫閱讀 713評論 0 7
  • 引言 Objective-C是一門動態(tài)語言望薄,在OC中方法的調用在編譯期時并不能真正決定調用的是哪個方法疟游。只有在真正...
    姜濤12345閱讀 292評論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險痕支,但是人生放棄了冒險颁虐,也就放棄了無數的可能。 ...
    yichen大刀閱讀 6,052評論 0 4