前提: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];
就可以啦,所以在父类中不要把类型写死
即谁要调用就创建他自己类型的对象
网友评论