1. //
  2. // main.m
  3. // 类的启动过程
  4.  
  5. #import <Foundation/Foundation.h>
  6. #import "Person.h"
  7. #import "GoodStudent.h"
  8.  
  9. /* 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
  10. load方法会在当前类被加载到内存的时候调用, 有且仅会调用一次
  11. 如果存在继承关系, 会先调用父类的load方法, 再调用子类的load方法*/
  12.  
  13. int main(int argc, const char * argv[]) {
  14. /*2017-08-23 15:05:08.882568+0800 类的启动过程[36713:860727] Car类被加载到内存了
  15. 2017-08-23 15:05:16.019104+0800 类的启动过程[36713:860727] Person类被加载到内存了
  16. 2017-08-23 15:05:17.390692+0800 类的启动过程[36713:860727] Student类被加载到内存了
  17. 2017-08-23 15:05:19.161607+0800 类的启动过程[36713:860727] GoodStudent类被加载到内存了
  18. 还没有使用类的时候就加载到内存了。
  19. */
  20.  
  21. Person *p1 = [[Person alloc] init];
  22. Person *p2 = [[Person alloc] init];
  23. Person *p3 = [[Person alloc] init];
  24. Person *p4 = [[Person alloc] init];
  25.  
  26. GoodStudent *gstu = [[GoodStudent alloc] init];
  27.  
  28. /*
  29. 2017-08-23 15:08:55.461633+0800 类的启动过程[36844:863122] Person initialize
  30. 2017-08-23 15:09:01.543395+0800 类的启动过程[36844:863122] Studnet initialize
  31. 2017-08-23 15:09:06.376914+0800 类的启动过程[36844:863122] GoodStudent initialize */
  32. return ;
  33. }
  1. //
  2. // Person.h
  3.  
  4. #import <Foundation/Foundation.h>
  5.  
  6. @interface Person : NSObject
  7. @end
  1. //
  2. // Person.m
  3.  
  4. #import "Person.h"
  5.  
  6. @implementation Person
  7. // 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
  8. // load方法会在当前类被加载到内存的时候调用, 有且仅会调用一次
  9. // 如果存在继承关系, 会先调用父类的load方法, 再调用子类的load方法
  10. + (void)load
  11. {
  12. NSLog(@"Person类被加载到内存了");
  13. }
  14.  
  15. // 当当前类第一次被使用的时候就会调用(创建类对象的时候)
  16. // initialize方法在整个程序的运行过程中只会被调用一次, 无论你使用多少次这个类都只会调用一次
  17. // initialize用于对某一个类进行一次性的初始化
  18. // initialize和load一样, 如果存在继承关系, 会先调用父类的initialize再调用子类的initialize
  19. + (void)initialize
  20. {
  21. NSLog(@"Person initialize");
  22. }
  23.  
  24. @end
  1. //
  2. // Student.h
  3.  
  4. #import "Person.h"
  5.  
  6. @interface Student : Person
  7.  
  8. @end
  1. //
  2. // Student.m
  3.  
  4. #import "Student.h"
  5.  
  6. @implementation Student
  7. + (void)load
  8. {
  9. NSLog(@"Student类被加载到内存了");
  10. }
  11. + (void)initialize
  12. {
  13. NSLog(@"Studnet initialize");
  14. }
  15. @end
  1. //
  2. // GoodStudent.h
  3.  
  4. #import "Student.h"
  5.  
  6. @interface GoodStudent : Student
  7.  
  8. @end
  1. //
  2. // GoodStudent.m
  3.  
  4. #import "GoodStudent.h"
  5.  
  6. @implementation GoodStudent
  7. + (void)load
  8. {
  9. NSLog(@"GoodStudent类被加载到内存了");
  10. }
  11. + (void)initialize
  12. {
  13. NSLog(@"GoodStudent initialize");
  14. }
  15.  
  16. @end
  1. //
  2. // Car.h
  3.  
  4. #import <Foundation/Foundation.h>
  5.  
  6. @interface Car : NSObject
  7.  
  8. @end
  1. //
  2. // Car.m
  3.  
  4. #import "Car.h"
  5.  
  6. @implementation Car
  7. + (void)load
  8. {
  9. NSLog(@"Car类被加载到内存了");
  10. }
  11. + (void)initialize
  12. {
  13. NSLog(@"Car initialize");
  14. }
  15. @end

oc40--类的启动过程的更多相关文章

  1. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  2. OC-私有方法,构造方法,类的本质及启动过程

    总结 标号 主题 内容 一 OC的私有方法 私有变量/私有方法 二 @property 概念/基本使用/寻找方法的过程/查找顺序 三 @synthesize @synthesize概念/基本使用/注意 ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  5. SpringMVC启动过程详解(li)

    通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...

  6. spark1.4.1 启动过程

    今天稍微没那么忙了,趁着这个时间,准备把spark的启动过程总结一下(),分享给大家.现在使用的spark1.4.1版本 当然前提是你已经把spark环境搭建好了. 1.我们启动spark的时候一般会 ...

  7. Linux启动过程详述

    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...

  8. App的启动过程

    App的启动过程 所有的app都是通过launcher去启动的 launcher自己也是一个app,一个系统级别的app,放在asystem/app/下,使用系统签名. 对代码进行分析

  9. OGRE启动过程详解(OGRE HelloWorld程序原理解析)

    本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行.会涉及的OGRE类包括: Root RenderSystem RenderWindow ...

随机推荐

  1. 如何修改wampserver中mysql中字符编码的解决方案

    因为我用的一般都是utf8,所以有必要改一下: 打开mysql控制台,输入密码登录之后,执行命令: show variables like ‘%char%’; 注意引号的中英文格式以及最后面的分号不要 ...

  2. Python 时间处理---------笔记

    时区处理&格式化 import pytz from datetime import datetime # 设置时区 timezone = pytz.timezone('Asia/Shangha ...

  3. [Windows Server 2003] 还原SQL Server数据库

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...

  4. mvc EF 出现异常, 能提示出那个字段出现问题

    } catch (DbEntityValidationException ex) { message = "添加异常"; desc = " {" + ex.Me ...

  5. 【转载】Linux下各文件夹的含义和用途

    原文地址:https://www.cnblogs.com/lanqingzhou/p/8037269.html Linux下各文件夹的含义和用途 Linux根目录”/“下各个系统文件夹的含义和用途 1 ...

  6. zTree 模糊搜索

    /** * 搜索树,高亮显示并展示[模糊匹配搜索条件的节点s] * @param treeId * @param searchConditionId 搜索条件Id */ function search ...

  7. [C++] muParser 的简单使用方法

    关于 muParser 库 许多应用程序需要解析数学表达式.该库的主要目的是提供一种快速简便的方法. muParser是一个用C ++编写的可扩展的高性能数学表达式解析器库. 它的工作原理是将数学表达 ...

  8. CF17E Palisection (回文自动机+DP)

    题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个 ...

  9. String s="a"+"b"+"c"+"d";创建了几个对象?

    对于如下代码: package reviewTest; /** * @ClassName: StringTest * @Description: 测试String的字符串相加优化 * @author ...

  10. 使用Robo 3T 软件管理MongoDB数据库如何执行命令行shell

    比如使用命令行的方式查看数据库runoobdb中的sites集合(数据表)中的所有数据 1.在连接名的地方鼠标右键选择“open shell” 2.在出现的shell窗口中输入一下命令行,然后按ctr ...