iOS 分类中同名方法的调用顺序

2021-02-23  本文已影响0人  武一顶顶

主类和分类

一. 需要解决的问题

  1. 主类和分类中普通方法的调用顺序?
  2. 同一个主类的两个分类中的同名方法调用顺序?
  3. 分类中+load方法的调用顺序?
  4. 分类中+initialize 方法的调用顺序?

二. 测试环境搭建

  1. 创建下面这些测试用的类


    这里写图片描述
  2. 加入一个pch文件方便打印

#ifdef DEBUG
#define LGLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ## __VA_ARGS__);
#else
#define LGLog(...)
#endif
--------------------- 

主要内容

1. 主类,子类和分类中的+load方法的加载

//Person
+ (void)load{
    LGLog();
}
//-------------
//Son
+ (void)load{
    LGLog();
}
//-------------
Person+A
+ (void)load{
    LGLog();
}
//-------------
Person+B
+ (void)load{
    LGLog();
}
//-------------
Person+C
+ (void)load{
    LGLog();
}
--------------------- 

2. 结论

1. 探究主类和分类的普通同名方法调用顺序

+ (void)commonClsMethod{
    LGLog();
}
- (void)commonInstanceMethod{
   LGLog();
}
  1. 正常结果


    这里写图片描述
  2. 分类文件警告


    这里写图片描述

结论

探究+ initialize方法的调用

  [[Son new] commonInstanceMethod];
这里写图片描述

结论

总结

  1. 普通方法的优先级: 分类> 子类 > 父类, 优先级高的同名方法覆盖优先级低的
  2. +load方法的优先级: 父类> 子类> 分类
  3. +load方法是在main() 函数之前调用,所有的类文件都会加载,包括分类
  4. +load方法不会被覆盖
  5. 同一主类的不同分类中的普通同名方法调用, 取决于编译的顺序, 后编译的文件中的同名方法会覆盖前面所有的,包括主类. +load方法的顺序也取决于编译顺序, 但是不会覆盖
  6. 分类中的方法名和主类方法名一样会报警告, 不会报错
  7. 声明和实现可以写在不同的分类中, 依然能找到实现
  8. 当第一次用到类的时候, 如果重写了+ initialize方法,会去调用
  9. 当调用子类的+ initialize方法时候, 先调用父类的,如果父类有分类, 那么分类的+ initialize会覆盖掉父类的, 和普通方法差不多
  10. 父类的+ initialize不一定会调用, 因为有可能父类的分类重写了它

demo

转载 https://blog.csdn.net/appleLg/article/details/79931742

上一篇 下一篇

猜你喜欢

热点阅读