iOS多态:初始化时效果出不来?可能是因为覆盖了父类的同名方法

本文通过一个具体的实例说明了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多态和运行时机制是非常重要的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值