iOS中[super class]為何會(huì)輸出子類類型?
比如有一個(gè)自定義類DetailViewController繼承自類UIViewController。那么我們對這個(gè)自定義類分別使用[self class]和[super class]將會(huì)分別輸出如下結(jié)果:
| [self class] | [super class] |
|---|---|
| DetailViewController | DetailViewController |
1.問題?
按照面向?qū)ο蟮乃季S, [super class] 應(yīng)該會(huì)輸出父類類型也就是UIViewController,而從結(jié)果可以看到這兩個(gè)輸出都是一樣的,那這是什么原因?qū)е碌哪兀?/p>
我們知道實(shí)際上在iOS中,對方法的調(diào)用是通過發(fā)送消息來完成的。也就是說使用 [self class] 時(shí),會(huì)使用obj_msgSend(id theReceiver, SEL selector, ...)函數(shù)向Receiver來發(fā)送消息。而使用 [super class] 時(shí),會(huì)使用obj_msgsendSuper(...)函數(shù)向Receiver來發(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。