比如有一個(gè)自定義類DetailViewController繼承自類UIViewController描验。那么我們對(duì)這個(gè)自定義類分別使用[self class]和[super class]將會(huì)分別輸出如下結(jié)果:
[self class] [super class]
DetailViewController DetailViewController
1. 問(wèn)題?
按照面向?qū)ο蟮乃季S, [super class] 應(yīng)該會(huì)輸出父類類型也就是UIViewController
怔昨,而從結(jié)果可以看到這兩個(gè)輸出都是一樣的趾代,那這是什么原因?qū)е碌哪兀?/p>
我們知道實(shí)際上在iOS中敛纲,對(duì)方法的調(diào)用是通過(guò)發(fā)送消息來(lái)完成的够委。也就是說(shuō)使用 [self class] 時(shí)扰魂,會(huì)使用obj_msgSend(id theReceiver, SEL selector, ...)函數(shù)向Receiver來(lái)發(fā)送消息傅物。而使用 [super class] 時(shí)夯辖,會(huì)使用obj_msgsendSuper(...)函數(shù)向Receiver來(lái)發(fā)送消息。
2. 分析
1). 然而obj_msgSend(...)和obj_msgSendSuper(...)中Receiver都是self董饰,這里的self也就是DetailViewController
2). [self class]和[super class]都會(huì)找到 NSObject中class方法
3). 當(dāng)[super class]找到NSObject中的class方法以后蒿褂,仍然會(huì)使用obj_msgSend(receiver, @selector(class))函數(shù),因?yàn)閞eceiver不變卒暂,所以輸出的結(jié)果仍舊是DetailViewController
附
[super class]找到NSObject中class方法以后啄栓,reciever不變實(shí)際上是因?yàn)?strong>super只是一個(gè)“編譯器指示符”,它和self指向的是相同的receiver也祠。
作者:Muiz
鏈接:http://www.reibang.com/p/ee0fb7f289b2
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有昙楚。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處诈嘿。</pre>