天天看點

iOS多态:初始化時效果出不來?可能是因為覆寫了父類的同名方法

首先說下多态,最直覺的了解就是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多态和運作時機制是非常重要的!