寫在前面
再有倆小時不到就國慶了瞒御,八天假期實在美滋滋父叙,搞得現(xiàn)在一點上班的心思都沒了,也因為現(xiàn)在app沒什么好修改的了肴裙,閑著無聊就測試下在OC中繼承與Category
的方法調(diào)用的優(yōu)先級趾唱。
(之所以選擇測試?yán)^承與Category
,是因為這部分知識比較簡單,大家都學(xué)過蜻懦,用來打發(fā)時間是比較合適的)
OC的三大特性:封裝
甜癞、繼承
、多態(tài)
,使用繼承的好處大家也都很了解了:實現(xiàn)代碼的復(fù)用
宛乃、對問題的統(tǒng)一處理
等等悠咱。
目的:測試?yán)^承和延展的方法調(diào)用優(yōu)先級
我這里創(chuàng)建了四個類蒸辆,ClassA、ClassB析既、ClassC躬贡、ClassD
,其中ClassA
繼承自NSObject
,ClassD
繼承自C
,C
繼承自B
眼坏,B
繼承自A
拂玻,又寫了一個NSObject
的延展NSObject + Class
,各自聲明和實現(xiàn)了方法 + (void)logMessage;
+ (void)logMessage
{
NSLog(@"this is category / classA / ClassB / ClassC / ClassD method ----");
}
在控制器導(dǎo)入四個類和延展空骚,頁面有四個按鈕(ClassA
、ClassB
擂仍、ClassC
囤屹、ClassD
),點擊方法分別調(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
中方法實現(xiàn)肋坚,保留.h
中的方法聲明,注釋掉NSObject+Class
中logMessage
方法的聲明和實現(xiàn)肃廓,防止Category
的影響智厌。
點擊ClassA
按鈕,不出意外的程序掛掉了盲赊,
reason
提示說ClassA
找不到logMessage
方法铣鹏,說明父類并不會調(diào)用子類的方法
二、測試自身和父類方法的調(diào)用優(yōu)先級
點擊ClassB
按鈕哀蘑,查看打印信息為
InheritDemo[25434:811698] this is ClassB method ----
說明自身的方法優(yōu)先于父類被調(diào)用
三诚卸、測試自身和 category
方法調(diào)用優(yōu)先級
導(dǎo)入ClassA + Class
文件,并實現(xiàn)logMessage
方法绘迁,
點擊ClassA
按鈕合溺, 查看打印信息為
InheritDemo[25434:811698] this is ClassA category method ----
說明** Category
方法的調(diào)用優(yōu)先于自身的方法調(diào)用**
四、測試自身和父類的Category
的優(yōu)先級
注釋掉ClassB + Category
中的方法聲明和實現(xià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
會為類增加一個方法,而且會最優(yōu)先調(diào)用