美文网首页
子类调用并扩充父类方法

子类调用并扩充父类方法

作者: AYuan_ | 来源:发表于2016-01-26 03:30 被阅读67次

    前提:B继承自父类A
    父类A中有个类方法如下:

    + (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title
    {
       A *settingItem = [A alloc] init];
        
        settingItem.icon = icon;
        settingItem.title = title;
        
        return settingItem;
    
    }
    

    这样是不合理的,因为如果子类B想调用这个方法并扩充时有时候就走不通了
    比如:

    + (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title destVcClass:(__unsafe_unretained Class)destVcClass
    {
        B *settingItem = [self itemWithIcon:icon title:title];
        settingItem.destVcClass = destVcClass;
        return settingItem;
    }
    

    此时跑起来会出现我们遇到频率最高的bug:

    -[A setDestVcClass:]: unrecognized selector sent to instance 0x7b385920
    

    因为

    • destVcClass这个属性是子类B特有
    • 而[self itemWithIcon:icon title:title]返回的对象settingItem是父类A类型的
    • 所以settingItem也就访问不到子类私有的属性

    于是我当时非常傻逼的将返回的对象强转了一下:

    B *settingItem = (B *)[self itemWithIcon:icon title:title];
    

    当然还是不对的

    经过一步步调试后终于杀死了这只bug,将父类A中那行:

     A *settingItem = [A alloc] init];
    

    改为

     A *settingItem = [self alloc] init];
    

    就可以啦,所以在父类中不要把类型写死
    即谁要调用就创建他自己类型的对象

    相关文章

      网友评论

          本文标题:子类调用并扩充父类方法

          本文链接:https://www.haomeiwen.com/subject/eeldkttx.html