寫在前面
再有倆小時不到就國慶了,八天假期實在美滋滋,搞得現在一點上班的心思都沒了,也因為現在app沒什么好修改的了,閑著無聊就測試下在OC中繼承與Category
的方法調用的優先級。
(之所以選擇測試繼承與Category
,是因為這部分知識比較簡單,大家都學過,用來打發時間是比較合適的)
OC的三大特性:封裝
、繼承
、多態
,使用繼承的好處大家也都很了解了:實現代碼的復用
、對問題的統一處理
等等。
目的:測試繼承和延展的方法調用優先級
我這里創建了四個類,ClassA、ClassB、ClassC、ClassD
,其中ClassA
繼承自NSObject
,ClassD
繼承自C
,C
繼承自B
,B
繼承自A
,又寫了一個NSObject
的延展NSObject + Class
,各自聲明和實現了方法 + (void)logMessage;
+ (void)logMessage
{
NSLog(@"this is category / classA / ClassB / ClassC / ClassD method ----");
}
在控制器導入四個類和延展,頁面有四個按鈕(ClassA
、ClassB
、ClassC
、ClassD
),點擊方法分別調用各類的方法
- (IBAction)classA:(id)sender {
[ClassA logMessage];
}
- (IBAction)classB:(id)sender {
[ClassB logMessage];
}
- (IBAction)classC:(id)sender {
[ClassC logMessage];
}
- (IBAction)classD:(id)sender {
[ClassD logMessage];
}
一、測試父類是否會調用子類的方法
注釋掉ClassA
中方法實現,保留.h
中的方法聲明,注釋掉NSObject+Class
中logMessage
方法的聲明和實現,防止Category
的影響。
點擊ClassA
按鈕,不出意外的程序掛掉了,
reason
提示說ClassA
找不到logMessage
方法,說明父類并不會調用子類的方法
二、測試自身和父類方法的調用優先級
點擊ClassB
按鈕,查看打印信息為
InheritDemo[25434:811698] this is ClassB method ----
說明自身的方法優先于父類被調用
三、測試自身和 category
方法調用優先級
導入ClassA + Class
文件,并實現logMessage
方法,
點擊ClassA
按鈕, 查看打印信息為
InheritDemo[25434:811698] this is ClassA category method ----
說明** Category
方法的調用優先于自身的方法調用**
四、測試自身和父類的Category
的優先級
注釋掉ClassB + Category
中的方法聲明和實現,點擊ClassB
按鈕,查看打印信息,看ClassB
是調用ClassA category
(也就是其父類的category
)中的方法還是ClassB
中的方法。
控制臺輸出為:
InheritDemo[25476:817259] this is ClassB method----
說明ClassB
是調用了ClassB
(也就是自身)中的方法,也就是說明自身的方法調用會優于父類的category
方法被調用
總結:
- 方法調用順序:自身
category
> 自身方法 > 父類的category
> 父類方法- 父類不會調用子類的方法
Category
會為類增加一個方法,而且會最優先調用