首先說下多态,最直覺的了解就是OC種的數組!分為兩種,一種是NSArray,一種是NSMutableArray,前者是後者的父類!
相信大家在實際寫代碼過程中也有類似的發現,NSArray可以接收NSMutableArray産生的對象,而反過來不可以,這就是多态!
也就是說多态就是父類指針可以指向子類指針!
然後今天在碼完代碼開始測試時,發現button的titleColor效果一直出不來,各種檢查都沒有查出來問題!
最後在打了N個斷點後發現我的button是通過繼承自UIButton的MyButton中繼承過來的,而在MyButton初始化時為了代碼清晰,
我使用了下面的處理
#import <UIKit/UIKit.h>
@interface MyButton : UIButton
@end
- (instancetype)init{
if (self = [super init]) {
[self setup];
}
return self;
}
- (void)setup{
// 初始化時設定,可以加載一些主題風格
}
然後我再button初始化的時候也采取了同樣的方式
#import <UIKit/UIKit.h>
@interface SubButton : MyButton
@end
- (instancetype)init{
if (self = [super init]) {
[self setup];
}
return self;
}
- (void)setup{
// 初始化時設定,可以在具體使用時加載具體不同的style
}
然後就跳進坑裡了!
因為子類重寫了父類裡面的同名方法,而由于多态的關系,在父類調用setup的時候,self指向的是SubButton對象,是以最後調用的依然是SubButton的setup方法!
是以最後父類初始化時的setup就這樣被忽視了!
因為子類不需要設定全部效果,是以看起來很明顯效果不同,非常容易察覺出錯,但是一些非直覺效果的這類錯誤沒有經驗很難查找...
總結經驗:事實上,深入了解iOS多态和運作時機制是非常重要的!