oc40--类的启动过程
- //
- // main.m
- // 类的启动过程
- #import <Foundation/Foundation.h>
- #import "Person.h"
- #import "GoodStudent.h"
- /* 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
- load方法会在当前类被加载到内存的时候调用, 有且仅会调用一次
- 如果存在继承关系, 会先调用父类的load方法, 再调用子类的load方法*/
- int main(int argc, const char * argv[]) {
- /*2017-08-23 15:05:08.882568+0800 类的启动过程[36713:860727] Car类被加载到内存了
- 2017-08-23 15:05:16.019104+0800 类的启动过程[36713:860727] Person类被加载到内存了
- 2017-08-23 15:05:17.390692+0800 类的启动过程[36713:860727] Student类被加载到内存了
- 2017-08-23 15:05:19.161607+0800 类的启动过程[36713:860727] GoodStudent类被加载到内存了
- 还没有使用类的时候就加载到内存了。
- */
- Person *p1 = [[Person alloc] init];
- Person *p2 = [[Person alloc] init];
- Person *p3 = [[Person alloc] init];
- Person *p4 = [[Person alloc] init];
- GoodStudent *gstu = [[GoodStudent alloc] init];
- /*
- 2017-08-23 15:08:55.461633+0800 类的启动过程[36844:863122] Person initialize
- 2017-08-23 15:09:01.543395+0800 类的启动过程[36844:863122] Studnet initialize
- 2017-08-23 15:09:06.376914+0800 类的启动过程[36844:863122] GoodStudent initialize */
- return ;
- }
- //
- // Person.h
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- @end
- //
- // Person.m
- #import "Person.h"
- @implementation Person
- // 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
- // load方法会在当前类被加载到内存的时候调用, 有且仅会调用一次
- // 如果存在继承关系, 会先调用父类的load方法, 再调用子类的load方法
- + (void)load
- {
- NSLog(@"Person类被加载到内存了");
- }
- // 当当前类第一次被使用的时候就会调用(创建类对象的时候)
- // initialize方法在整个程序的运行过程中只会被调用一次, 无论你使用多少次这个类都只会调用一次
- // initialize用于对某一个类进行一次性的初始化
- // initialize和load一样, 如果存在继承关系, 会先调用父类的initialize再调用子类的initialize
- + (void)initialize
- {
- NSLog(@"Person initialize");
- }
- @end
- //
- // Student.h
- #import "Person.h"
- @interface Student : Person
- @end
- //
- // Student.m
- #import "Student.h"
- @implementation Student
- + (void)load
- {
- NSLog(@"Student类被加载到内存了");
- }
- + (void)initialize
- {
- NSLog(@"Studnet initialize");
- }
- @end
- //
- // GoodStudent.h
- #import "Student.h"
- @interface GoodStudent : Student
- @end
- //
- // GoodStudent.m
- #import "GoodStudent.h"
- @implementation GoodStudent
- + (void)load
- {
- NSLog(@"GoodStudent类被加载到内存了");
- }
- + (void)initialize
- {
- NSLog(@"GoodStudent initialize");
- }
- @end
- //
- // Car.h
- #import <Foundation/Foundation.h>
- @interface Car : NSObject
- @end
- //
- // Car.m
- #import "Car.h"
- @implementation Car
- + (void)load
- {
- NSLog(@"Car类被加载到内存了");
- }
- + (void)initialize
- {
- NSLog(@"Car initialize");
- }
- @end
oc40--类的启动过程的更多相关文章
- 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- OC-私有方法,构造方法,类的本质及启动过程
总结 标号 主题 内容 一 OC的私有方法 私有变量/私有方法 二 @property 概念/基本使用/寻找方法的过程/查找顺序 三 @synthesize @synthesize概念/基本使用/注意 ...
- zookeeper源码分析之一服务端启动过程
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
- SpringMVC启动过程详解(li)
通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...
- spark1.4.1 启动过程
今天稍微没那么忙了,趁着这个时间,准备把spark的启动过程总结一下(),分享给大家.现在使用的spark1.4.1版本 当然前提是你已经把spark环境搭建好了. 1.我们启动spark的时候一般会 ...
- Linux启动过程详述
http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...
- App的启动过程
App的启动过程 所有的app都是通过launcher去启动的 launcher自己也是一个app,一个系统级别的app,放在asystem/app/下,使用系统签名. 对代码进行分析
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行.会涉及的OGRE类包括: Root RenderSystem RenderWindow ...
随机推荐
- 如何修改wampserver中mysql中字符编码的解决方案
因为我用的一般都是utf8,所以有必要改一下: 打开mysql控制台,输入密码登录之后,执行命令: show variables like ‘%char%’; 注意引号的中英文格式以及最后面的分号不要 ...
- Python 时间处理---------笔记
时区处理&格式化 import pytz from datetime import datetime # 设置时区 timezone = pytz.timezone('Asia/Shangha ...
- [Windows Server 2003] 还原SQL Server数据库
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...
- mvc EF 出现异常, 能提示出那个字段出现问题
} catch (DbEntityValidationException ex) { message = "添加异常"; desc = " {" + ex.Me ...
- 【转载】Linux下各文件夹的含义和用途
原文地址:https://www.cnblogs.com/lanqingzhou/p/8037269.html Linux下各文件夹的含义和用途 Linux根目录”/“下各个系统文件夹的含义和用途 1 ...
- zTree 模糊搜索
/** * 搜索树,高亮显示并展示[模糊匹配搜索条件的节点s] * @param treeId * @param searchConditionId 搜索条件Id */ function search ...
- [C++] muParser 的简单使用方法
关于 muParser 库 许多应用程序需要解析数学表达式.该库的主要目的是提供一种快速简便的方法. muParser是一个用C ++编写的可扩展的高性能数学表达式解析器库. 它的工作原理是将数学表达 ...
- CF17E Palisection (回文自动机+DP)
题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个 ...
- String s="a"+"b"+"c"+"d";创建了几个对象?
对于如下代码: package reviewTest; /** * @ClassName: StringTest * @Description: 测试String的字符串相加优化 * @author ...
- 使用Robo 3T 软件管理MongoDB数据库如何执行命令行shell
比如使用命令行的方式查看数据库runoobdb中的sites集合(数据表)中的所有数据 1.在连接名的地方鼠标右键选择“open shell” 2.在出现的shell窗口中输入一下命令行,然后按ctr ...