区块链技术博客
www.b2bchain.cn

OC中load和initialize方法求职学习资料

本文介绍了OC中load和initialize方法求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

最近在因为工作的原因,空余时间相对多了一点。所以准备好好整理一下OC相关的基础知识,以便加固相关的知识点。

+load方法

调用时机

  1. +load方法会在runtime加载类和分类时调用;
  2. 每个类和分类在程序运行中只调用一次+load方法;
  3. 只要是在Compile Sources中的文件总会被加载,这与这个类是否被用到无关,因此+load方法总是在main函数之前被调用。

调用顺序

  1. 执行父类的+load方法
  2. 执行当前类的+load方法
  3. 执行分类的+load方法
  4. 不同的类之间方法调用顺序根据Compile Sources中文件的顺序来 下面我们看下实际调用情况:
//Person.m + (void)load {     NSLog(@"====== Person load function ======"); }  //Fruit.m + (void)load {     NSLog(@"====== Fruit load function ======"); }  //Person子类Student +(void)load {     NSLog(@"======= Student load function ======="); }  //Person子类 Boy +(void)load {     NSLog(@"===== Boy load function ====="); }  //Person+Height分类 +(void)load {     NSLog(@"===== Person (Height) load function ====="); }  //Person+Gender分类 + (void)load {     NSLog(@"======= Person (Gender) load function ========"); } //运行结果 /* 2019-07-24 17:36:54.231549+0800 LoadDemo[10707:328172] ====== Person load function ====== 2019-07-24 17:36:54.232529+0800 LoadDemo[10707:328172] ======= Student load function ======= 2019-07-24 17:36:54.232701+0800 LoadDemo[10707:328172] ===== Boy load function ===== 2019-07-24 17:36:54.232834+0800 LoadDemo[10707:328172] ====== Fruit load function ====== 2019-07-24 17:36:54.232949+0800 LoadDemo[10707:328172] ===== Person (Height) load function ===== 2019-07-24 17:36:54.233059+0800 LoadDemo[10707:328172] ======= Person (Gender) load function ======== 2019-07-24 17:36:54.233225+0800 LoadDemo[10707:328172] ============== main function =========/n */

OC中load和initialize方法

如果一个类没有实现+load方法,那么就不会调用它的+load方法。在Compile Sources中,文件的排放顺讯就是其加载顺序,也就是+load方法的调用顺序。从其中也可以看出Person+load方法调用顺序优先于子类BoyStudent的顺序。同时子类中+load方法的调用顺序则是Compile Sources中文件的摆放顺序。

使用场景
从上面可以看出+load函数调用在main函数之前,同时+load方法时的环境很不安全,我们应该尽量减少+load方法的逻辑。另一个原因是+load的方法是线程安全的,它内部使用了锁,所以我们应当避免线程阻塞在+load方法中。
常见的使用+load方法的场景就是Method Swizzle:

+ (void)load {     Method orginalFunc = class_getInstanceMethod([self class],(originalFunc));     Method swizzleFunc = class_getInstanceMethod([self class],(swizzleFunc));     method_exchangeImplementations(orginalFunc, swizzleFunc); }

initialize调用

调用时机

initialize方法在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次。该方法实际上是一种惰性方法,也就是说如果一个类没有被用到,那它的initialize方法就不会调用。

调用顺序
  1. 先调用父类的initialize方法,并且即使子类没有实现initialize方法,也会调用父类方法。
  2. 创建子类,如果子类没有实现initialize方法,父类initialize方法会调用多次。因为创建子类对象是要创建父类对象
  3. 有分类的类会调用分类实现的initialize方法,而不调用当前类的initialize方法。
//Person.m + (void)initialize {     NSLog(@"===== Person initialize function ====="); } //调用  Student *student = [[Student alloc] init];  // Student中未实现initialize方法,打印结果 2019-07-25 15:20:51.585788+0800 LoadDemo[19894:580248] ===== Person initialize function ===== 2019-07-25 15:20:51.585972+0800 LoadDemo[19894:580248] ===== Person initialize function =====  //Student中实现initialize方法,打印结果 2019-07-25 15:23:06.068990+0800 LoadDemo[19929:581522] ===== Person initialize function ===== 2019-07-25 15:23:06.069200+0800 LoadDemo[19929:581522] ===== Student initialize function =====

要避免分类为实现initialize方法,导致父类initialize方法多次调用可以使用如下方式:

+ (void)initialize {     if (self == [Person class]) {         NSLog(@"===== Person initialize function =====");     } }
使用场景

在initialize中可以初始化一些静态对象

static NSMutableArray *emptyArray;  + (void)initialize {     if (self == [Person class]) {         emptyArray = [[NSMutableArray alloc] init];         NSLog(@"===== Person initialize function =====");     } }

前言

最近在因为工作的原因,空余时间相对多了一点。所以准备好好整理一下OC相关的基础知识,以便加固相关的知识点。

+load方法

调用时机

  1. +load方法会在runtime加载类和分类时调用;
  2. 每个类和分类在程序运行中只调用一次+load方法;
  3. 只要是在Compile Sources中的文件总会被加载,这与这个类是否被用到无关,因此+load方法总是在main函数之前被调用。

调用顺序

  1. 执行父类的+load方法
  2. 执行当前类的+load方法
  3. 执行分类的+load方法
  4. 不同的类之间方法调用顺序根据Compile Sources中文件的顺序来 下面我们看下实际调用情况:
//Person.m + (void)load {     NSLog(@"====== Person load function ======"); }  //Fruit.m + (void)load {     NSLog(@"====== Fruit load function ======"); }  //Person子类Student +(void)load {     NSLog(@"======= Student load function ======="); }  //Person子类 Boy +(void)load {     NSLog(@"===== Boy load function ====="); }  //Person+Height分类 +(void)load {     NSLog(@"===== Person (Height) load function ====="); }  //Person+Gender分类 + (void)load {     NSLog(@"======= Person (Gender) load function ========"); } //运行结果 /* 2019-07-24 17:36:54.231549+0800 LoadDemo[10707:328172] ====== Person load function ====== 2019-07-24 17:36:54.232529+0800 LoadDemo[10707:328172] ======= Student load function ======= 2019-07-24 17:36:54.232701+0800 LoadDemo[10707:328172] ===== Boy load function ===== 2019-07-24 17:36:54.232834+0800 LoadDemo[10707:328172] ====== Fruit load function ====== 2019-07-24 17:36:54.232949+0800 LoadDemo[10707:328172] ===== Person (Height) load function ===== 2019-07-24 17:36:54.233059+0800 LoadDemo[10707:328172] ======= Person (Gender) load function ======== 2019-07-24 17:36:54.233225+0800 LoadDemo[10707:328172] ============== main function =========/n */

OC中load和initialize方法

如果一个类没有实现+load方法,那么就不会调用它的+load方法。在Compile Sources中,文件的排放顺讯就是其加载顺序,也就是+load方法的调用顺序。从其中也可以看出Person+load方法调用顺序优先于子类BoyStudent的顺序。同时子类中+load方法的调用顺序则是Compile Sources中文件的摆放顺序。

使用场景
从上面可以看出+load函数调用在main函数之前,同时+load方法时的环境很不安全,我们应该尽量减少+load方法的逻辑。另一个原因是+load的方法是线程安全的,它内部使用了锁,所以我们应当避免线程阻塞在+load方法中。
常见的使用+load方法的场景就是Method Swizzle:

+ (void)load {     Method orginalFunc = class_getInstanceMethod([self class],(originalFunc));     Method swizzleFunc = class_getInstanceMethod([self class],(swizzleFunc));     method_exchangeImplementations(orginalFunc, swizzleFunc); }

initialize调用

调用时机

initialize方法在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次。该方法实际上是一种惰性方法,也就是说如果一个类没有被用到,那它的initialize方法就不会调用。

调用顺序
  1. 先调用父类的initialize方法,并且即使子类没有实现initialize方法,也会调用父类方法。
  2. 创建子类,如果子类没有实现initialize方法,父类initialize方法会调用多次。因为创建子类对象是要创建父类对象
  3. 有分类的类会调用分类实现的initialize方法,而不调用当前类的initialize方法。
//Person.m + (void)initialize {     NSLog(@"===== Person initialize function ====="); } //调用  Student *student = [[Student alloc] init];  // Student中未实现initialize方法,打印结果 2019-07-25 15:20:51.585788+0800 LoadDemo[19894:580248] ===== Person initialize function ===== 2019-07-25 15:20:51.585972+0800 LoadDemo[19894:580248] ===== Person initialize function =====  //Student中实现initialize方法,打印结果 2019-07-25 15:23:06.068990+0800 LoadDemo[19929:581522] ===== Person initialize function ===== 2019-07-25 15:23:06.069200+0800 LoadDemo[19929:581522] ===== Student initialize function =====

要避免分类为实现initialize方法,导致父类initialize方法多次调用可以使用如下方式:

+ (void)initialize {     if (self == [Person class]) {         NSLog(@"===== Person initialize function =====");     } }
使用场景

在initialize中可以初始化一些静态对象

static NSMutableArray *emptyArray;  + (void)initialize {     if (self == [Person class]) {         emptyArray = [[NSMutableArray alloc] init];         NSLog(@"===== Person initialize function =====");     } }

前言

最近在因为工作的原因,空余时间相对多了一点。所以准备好好整理一下OC相关的基础知识,以便加固相关的知识点。

+load方法

调用时机

  1. +load方法会在runtime加载类和分类时调用;
  2. 每个类和分类在程序运行中只调用一次+load方法;
  3. 只要是在Compile Sources中的文件总会被加载,这与这个类是否被用到无关,因此+load方法总是在main函数之前被调用。

调用顺序

  1. 执行父类的+load方法
  2. 执行当前类的+load方法
  3. 执行分类的+load方法
  4. 不同的类之间方法调用顺序根据Compile Sources中文件的顺序来 下面我们看下实际调用情况:
//Person.m + (void)load {     NSLog(@"====== Person load function ======"); }  //Fruit.m + (void)load {     NSLog(@"====== Fruit load function ======"); }  //Person子类Student +(void)load {     NSLog(@"======= Student load function ======="); }  //Person子类 Boy +(void)load {     NSLog(@"===== Boy load function ====="); }  //Person+Height分类 +(void)load {     NSLog(@"===== Person (Height) load function ====="); }  //Person+Gender分类 + (void)load {     NSLog(@"======= Person (Gender) load function ========"); } //运行结果 /* 2019-07-24 17:36:54.231549+0800 LoadDemo[10707:328172] ====== Person load function ====== 2019-07-24 17:36:54.232529+0800 LoadDemo[10707:328172] ======= Student load function ======= 2019-07-24 17:36:54.232701+0800 LoadDemo[10707:328172] ===== Boy load function ===== 2019-07-24 17:36:54.232834+0800 LoadDemo[10707:328172] ====== Fruit load function ====== 2019-07-24 17:36:54.232949+0800 LoadDemo[10707:328172] ===== Person (Height) load function ===== 2019-07-24 17:36:54.233059+0800 LoadDemo[10707:328172] ======= Person (Gender) load function ======== 2019-07-24 17:36:54.233225+0800 LoadDemo[10707:328172] ============== main function =========/n */

OC中load和initialize方法

如果一个类没有实现+load方法,那么就不会调用它的+load方法。在Compile Sources中,文件的排放顺讯就是其加载顺序,也就是+load方法的调用顺序。从其中也可以看出Person+load方法调用顺序优先于子类BoyStudent的顺序。同时子类中+load方法的调用顺序则是Compile Sources中文件的摆放顺序。

使用场景
从上面可以看出+load函数调用在main函数之前,同时+load方法时的环境很不安全,我们应该尽量减少+load方法的逻辑。另一个原因是+load的方法是线程安全的,它内部使用了锁,所以我们应当避免线程阻塞在+load方法中。
常见的使用+load方法的场景就是Method Swizzle:

+ (void)load {     Method orginalFunc = class_getInstanceMethod([self class],(originalFunc));     Method swizzleFunc = class_getInstanceMethod([self class],(swizzleFunc));     method_exchangeImplementations(orginalFunc, swizzleFunc); }

initialize调用

调用时机

initialize方法在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次。该方法实际上是一种惰性方法,也就是说如果一个类没有被用到,那它的initialize方法就不会调用。

调用顺序
  1. 先调用父类的initialize方法,并且即使子类没有实现initialize方法,也会调用父类方法。
  2. 创建子类,如果子类没有实现initialize方法,父类initialize方法会调用多次。因为创建子类对象是要创建父类对象
  3. 有分类的类会调用分类实现的initialize方法,而不调用当前类的initialize方法。
//Person.m + (void)initialize {     NSLog(@"===== Person initialize function ====="); } //调用  Student *student = [[Student alloc] init];  // Student中未实现initialize方法,打印结果 2019-07-25 15:20:51.585788+0800 LoadDemo[19894:580248] ===== Person initialize function ===== 2019-07-25 15:20:51.585972+0800 LoadDemo[19894:580248] ===== Person initialize function =====  //Student中实现initialize方法,打印结果 2019-07-25 15:23:06.068990+0800 LoadDemo[19929:581522] ===== Person initialize function ===== 2019-07-25 15:23:06.069200+0800 LoadDemo[19929:581522] ===== Student initialize function =====

要避免分类为实现initialize方法,导致父类initialize方法多次调用可以使用如下方式:

+ (void)initialize {     if (self == [Person class]) {         NSLog(@"===== Person initialize function =====");     } }
使用场景

在initialize中可以初始化一些静态对象

static NSMutableArray *emptyArray;  + (void)initialize {     if (self == [Person class]) {         emptyArray = [[NSMutableArray alloc] init];         NSLog(@"===== Person initialize function =====");     } }

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » OC中load和initialize方法求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们