load和initialize

load

  • load方法只会调用一次,只要引入头文件就会调用#import
  • 如果一个类调用了load方法,会自动调用其父类的load方法,不用再load方法中不需手动实现,是自动调用父类的load方法
  • 如果没有实现load方法,那么不会调用父类的load方法
  • load方法是线程安全的,不要做耗时操作,会阻塞线程
  • 在load方法中可以runtime进行方法交换
+ (void)load {
Method current = class_getInstanceMethod([self class], @selector(originalFunc));
Method change = class_getInstanceMethod([self class], @selector(swizzledFunc));

method_exchangeImplementations(current, change);

}

Snip20160831_1.png

initialize

  • initialize方法在第一次创建时调用,跟load一样只调用一次

  • 如果子类没有使用initialize方法,一样会调用父类的initialize方法

  • 使用的时候,为了保证initialize只调用一次,应该做一个判断,为当前类时调用,不然什么都不做

      + (void)initialize {
      if (self == [CurrntObject class]) {
       }
      }
    

总结

  • 都不能手动调用load和initialize
  • load用来进行基于运行时的方法交换,initialize用来初始化静态变量或者全局变量
  • 都是线程安全的,不要进行耗时操作和一些可能阻塞线程的操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容