子类调用并扩充父类方法

前提: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];

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

你可能感兴趣的:(子类调用并扩充父类方法)