文档章节

iOS - + initialize 与 +load

Karlon
 Karlon
发布于 2016/05/09 17:16
字数 998
阅读 10
收藏 0

一、+ initialize 方法和+load 调用时机

  • 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量。


    • load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法。

  • 之后我们结合代码来探究一下 + initialize 与 + load 两个方法的调用时机,首先是 + load

    #pragram ---main函数中的代码---#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) {  NSLog(@"%s",__func__);  @autoreleasepool {      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
      }
    }#pragram ---基于NSObject的Person类---#import "Person.h"@implementation Person+ (void)load{  NSLog(@"%s",__func__);
    }
    + (void)initialize{
      [super initialize];  NSLog(@"%s %@",__func__,[self class]);
    }
    - (instancetype)init{  if (self = [super init]) {      NSLog(@"%s",__func__);
      }  return self;
    }@end#pragram ---基于Person的Son类---#import "Girl.h"@implementation Girl+ (void)load{  NSLog(@"%s ",__func__);
    }
    + (void)initialize{
      [super initialize];  NSLog(@"%s ",__func__);
    }
    - (instancetype)init{  if (self = [super init]) {      NSLog(@"%s",__func__);
      }  return self;
    }@end

    运行程序,我们看一下输出日志:

    2015-10-27 15:21:07.545 initialize[11637:334237] +[Person load]2015-10-27 15:21:07.546 initialize[11637:334237] +[Girl load] 
    2015-10-27 15:21:07.546 initialize[11637:334237] main

    这说明在我并没有对类做任何操作的情况下,+load 方法会被默认执行,并且是在 main 函数之前执行的。

  • 接下来我们来查看一下 + initialize 方法,先在 ViewController 中创建 Person 和 Girl 对象:

    #import "ViewController.h"#import "Person.h"#import "Son.h"#import "Girl.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {
      [super viewDidLoad];  Person * a = [Person new];  Person * b = [Person new];  Girl *c = [Girl new];  Girl *d = [Girl new];
    }@end

    下面我们来看一下输出日志:

    2015-10-27 15:33:56.195 initialize[11711:342410] +[Person load]2015-10-27 15:33:56.196 initialize[11711:342410] +[Girl load] 
    2015-10-27 15:33:56.197 initialize[11711:342410] main2015-10-27 15:33:56.259 initialize[11711:342410] +[Person initialize] Person2015-10-27 15:33:56.259 initialize[11711:342410] -[Person init]2015-10-27 15:33:56.259 initialize[11711:342410] -[Person init]2015-10-27 15:33:56.259 initialize[11711:342410] +[Girl initialize] 
    2015-10-27 15:33:56.260 initialize[11711:342410] -[Girl init]2015-10-27 15:33:56.260 initialize[11711:342410] -[Girl init]

    通过这个实验我们可以确定两点:

    • + initialize 方法类似一个懒加载,如果没有使用这个类,那么系统默认不会去调用这个方法,且默认只加载一次;

    • + initialize 的调用发生在 +init 方法之前。

  • 接下来再探究一下 + initialize 在父类与子类之间的关系,创建一个继承自 Person 类的 Son类:

    #pragram ---ViewController 中的代码---#import "ViewController.h"#import "Person.h"#import "Son.h"#import "Girl.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {
      [super viewDidLoad];
      Person * a = [Person new];
      Person * b = [Person new];
      Son*z = [Son new];
    }@end

    看一下输出日志:

    2015-10-27 15:44:55.762 initialize[12024:351576] +[Person load]2015-10-27 15:44:55.764 initialize[12024:351576] +[Son load]2015-10-27 15:44:55.764 initialize[12024:351576] +[Girl load] 
    2015-10-27 15:44:55.764 initialize[12024:351576] main2015-10-27 15:44:55.825 initialize[12024:351576] +[Person initialize] Person2015-10-27 15:44:55.825 initialize[12024:351576] -[Person init]2015-10-27 15:44:55.825 initialize[12024:351576] -[Person init]2015-10-27 15:44:55.826 initialize[12024:351576] +[Person initialize] Son2015-10-27 15:44:55.826 initialize[12024:351576] -[Person init]

    我们会发现 Person 类的 + initialize 方法又被调用了,但是查看一下是子类 Son 调用的,也就是创建子类的时候,子类会去调用父类的 + initialize 方法。


二、总结

  • 如果你实现了 + load 方法,那么当类被加载时它会自动被调用。这个调用非常早。如果你实现了一个应用或框架的 + load,并且你的应用链接到这个框架上了,那么 + load 会在 main() 函数之前被调用。如果你在一个可加载的 bundle 中实现了 + load,那么它会在 bundle 加载的过程中被调用。

  • + initialize 方法的调用看起来会更合理,通常在它里面写代码比在 + load 里写更好。+ initialize 很有趣,因为它是懒调用的,也有可能完全不被调用。类第一次被加载时,

  • + initialize 不会被调用。类接收消息时,运行时会先检查 + initialize 有没有被调用过。如果没有,会在消息被处理前调用。


本文转载自:http://www.jianshu.com/p/9368ce9bb8f9

共有 人打赏支持
Karlon
粉丝 10
博文 13
码字总数 3930
作品 0
深圳
程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
Framework7 v1.5.0 发布,HTML 移动端框架

Framework7 v1.5.0 发布了,该版本部分更新内容如下: App Root New app parameter to specify app root element, by default is . Useful when using F7 with libraries like Vue or React ......

局长
2016/11/09
3.7K
10
OpenRTMFP/Cumulus Primer(11)IO 管理之IO流

OpenRTMFP/Cumulus Primer(11)IO管理之IO流 Author: 柳大·Poechant(钟超) Email: zhongchao.ustc#gmail.com (#->@) Blog: Blog.CSDN.net/Poechant Date: April 24th, 2012 本文主要分析......

晨曦之光
2012/04/24
83
0
NativeScript 1.4.0 发布,跨平台移动开发

NativeScript 1.4.0 发布,此版本更新内容如下: 重大改进 (#774) Animation 类不再包含完成属性,因为一个动画可以在多个时间播放。 旧版代码 (JavaScript): animation1.play().finished.t...

oschina
2015/10/13
2.7K
4
Apple iOS MDM service 简介

转载:http://blog.nienyiho.com/apple-ios-mdm-service-introduction/ Apple iOS MDM service 簡介 藉由MDM服務,企業可以用來控管配發給員工的iOS Device。可以採用Apple官方推出的工具,也...

王石头
2013/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【PG内核】事务ID冷冻简述

数据库代码中事务ID的类型TransactionId定义为:typedef uint32 TransactionId。因此事务ID最大值为2^32-1=4294967295。 事务ID是需要循环使用的,为了做到这一点,数据库在做vacuum时将很老...

movead
25分钟前
13
0
深入学习SpringMVC以及学习总结

一、优点: 1.SpringMVC简化web程序开发; 2.SpringMVC效率很好(单例模式); 3.SpringMVC提供了大量扩展点,方便程序员自定义功能; 如果想学习Java工程化、高性能及分布式、深入浅出。微服...

编程SHA
25分钟前
1
0
关于开源分布式事务中间件Fescar,我们总结了开发者关心的13个问题

开源分布式事务中间件 Fescar 自1月10日上线v0.1版本以来,受到了开发者们的极大关注(watch249,star3005,fork649,社区讨论的issue58,数据统计于1月17日14:00),可见,天下苦分布式事务...

阿里云官方博客
25分钟前
1
0
斯皮格尔:我们敢于采纳非常疯狂的创意

“阅后即焚”照片分享应用 Snapchat 母公司 Snap 的 CEO 埃文-斯皮格尔(Evan Spiegel)近日接受了英国《金融时报》记者的采访,谈到了该公司的未来发展,与社交网络 Facebook 的竞争,限制自己...

linuxCool
27分钟前
1
0
javaweb文件上传以及文件上传成功后但是目录中没有显示

经过看别人写的代码然后自己实际操作一遍,基本都是搬运也是为了练习。1:创建fileUpLoad.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UT......

小橙子的曼曼
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部