寫在前面
再有倆小時(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è)按鈕(ClassA、ClassB、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+Class中logMessage方法的聲明和實(shí)現(xiàn),防止Category的影響。
點(diǎn)擊ClassA按鈕,不出意外的程序掛掉了,

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)用