溫故而知新-方法的繼承的調(diào)用順序

寫在前面

再有倆小時(shí)不到就國慶了,八天假期實(shí)在美滋滋,搞得現(xiàn)在一點(diǎn)上班的心思都沒了,也因?yàn)楝F(xiàn)在app沒什么好修改的了,閑著無聊就測試下在OC中繼承與Category的方法調(diào)用的優(yōu)先級。
(之所以選擇測試?yán)^承與Category,是因?yàn)檫@部分知識比較簡單,大家都學(xué)過,用來打發(fā)時(shí)間是比較合適的)

OC的三大特性:封裝、繼承、多態(tài),使用繼承的好處大家也都很了解了:實(shí)現(xiàn)代碼的復(fù)用對問題的統(tǒng)一處理等等。


目的:測試?yán)^承和延展的方法調(diào)用優(yōu)先級

我這里創(chuàng)建了四個(gè)類,ClassA、ClassB、ClassC、ClassD,其中ClassA繼承自NSObject,ClassD繼承自C,C繼承自B,B繼承自A,又寫了一個(gè)NSObject的延展NSObject + Class,各自聲明和實(shí)現(xiàn)了方法 + (void)logMessage;

+ (void)logMessage
{
    NSLog(@"this is category / classA  / ClassB / ClassC / ClassD  method ----");
}

在控制器導(dǎo)入四個(gè)類和延展,頁面有四個(gè)按鈕(ClassAClassB、ClassC、ClassD),點(diǎn)擊方法分別調(diào)用各類的方法

- (IBAction)classA:(id)sender {
  [ClassA logMessage];
}
- (IBAction)classB:(id)sender {
  [ClassB logMessage];
}
- (IBAction)classC:(id)sender {
  [ClassC logMessage];
}
- (IBAction)classD:(id)sender {
  [ClassD logMessage];
}
一、測試父類是否會調(diào)用子類的方法

注釋掉ClassA中方法實(shí)現(xiàn),保留.h中的方法聲明,注釋掉NSObject+ClasslogMessage方法的聲明和實(shí)現(xiàn),防止Category的影響。
點(diǎn)擊ClassA按鈕,不出意外的程序掛掉了,

屏幕快照 2017-09-30 下午5.44.44.png

reason提示說ClassA找不到logMessage方法,說明父類并不會調(diào)用子類的方法

二、測試自身和父類方法的調(diào)用優(yōu)先級

點(diǎn)擊ClassB按鈕,查看打印信息為

InheritDemo[25434:811698] this is ClassB method ----

說明自身的方法優(yōu)先于父類被調(diào)用

三、測試自身和 category方法調(diào)用優(yōu)先級

導(dǎo)入ClassA + Class文件,并實(shí)現(xiàn)logMessage方法,
點(diǎn)擊ClassA按鈕, 查看打印信息為

InheritDemo[25434:811698] this is ClassA category method ----

說明** Category方法的調(diào)用優(yōu)先于自身的方法調(diào)用**

四、測試自身和父類的Category的優(yōu)先級

注釋掉ClassB + Category中的方法聲明和實(shí)現(xiàn),點(diǎn)擊ClassB按鈕,查看打印信息,看ClassB是調(diào)用ClassA category(也就是其父類的category)中的方法還是ClassB中的方法。
控制臺輸出為:

InheritDemo[25476:817259] this is ClassB method----

說明ClassB是調(diào)用了ClassB(也就是自身)中的方法,也就是說明自身的方法調(diào)用會優(yōu)于父類的category方法被調(diào)用

總結(jié):

  • 方法調(diào)用順序:自身category > 自身方法 > 父類的category > 父類方法
  • 父類不會調(diào)用子類的方法
  • Category會為類增加一個(gè)方法,而且會最優(yōu)先調(diào)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容