OC类的本质,深入探讨,load方法和initialize方法
1:类的本质:类也是一种类,可以叫做类类,类对象,类类型;
2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念)
类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法;
而成员变量和isa指针,存放在了类的对象中;isa指针指向了类对象;如图:

3:类本身也是对象,是class类型的对象;
// 以person为例 Person *p1 = [[Person alloc] init];
Person *p1 = [[Person alloc] init]; // 获取类对象
// 1:通过对象获取
class c1 = [p1 class];
class c2 = [p2 class]; // 2:通过类获取
class c3 = [Person class]; NSLog(@"c1=%p, c2=%p, c3=%p", c1, c2, c3);
// 因为类对象在内存中只有一份,所以c1 c2 c3是同一个;
拿到类对象后可以调用类方法,上边的c1 c2 c3都是Person,都可以调用类方法;
4:load方法和initialize方法:
load:当程序启动,就会加载项目中所有的类,类加载完,就会调用load方法,只会调用一次,load方法不管是分类还是原来类,都要加载;只要是类就得加载;
initialize:当类第一次使用时会调用该方法,且调用一次;也可以把该方法看做是类的初始化(注意不是对象的初始化)方法,因为类只初始化一次,所以该方法也 就只执行一次;如果一个类没有被调用,则不会被调用;
initialize:他和load方法不同,load方法不管是分类还是原来类,子类父类,只要是类都要load,而initialize则不同,如果原来类和分类中都有initialize方法, 则会优先用分类中的initialize方法,且只调用分类中的initialize方法,原来类的initialize方法就补调用了;只有当分类中没有定义initialize方法时才会调用原来类 中的initialize方法;
OC类的本质,深入探讨,load方法和initialize方法的更多相关文章
- 转载 Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)
1,Action中get,set方法的使用流程? 前台form中有一个<input type="text" name="username"/> 如果 ...
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
- Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍
在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...
- 关于Object类的equals方法和hashCode方法
关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...
- Java取得一个对象里所有get方法和set方法, 读取某个类下所有变量的名称
所有get方法和set方法public void getMethod(Object obj){ Class clazz=obj.getClass();//获得实体类名 Field[] fields = ...
- StringBuffer类的delete()方法和deleteCharAt()方法的区别
引言 StringBuffer类的delete()方法和deleteCharAt()方法都是用来删除StringBuffer字符串中的字符 区别 1.对于delete(int start,int en ...
- 并发基础篇(六):线程Thread类的start()方法和run()方法【转载】
[转载] 一.初识java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thre ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
随机推荐
- asp.net MVC 如何隐藏 Response Header 版本号
根据借楼最少资源原则,有时候MVC需要隐藏自己的版本号,其实这里也是比较简单的,只需要在Global.ascx 的Application_Start()中添加一行代码既可 添加为 MVCHandle ...
- 表数据转换为insert语句
/* 对象:导出物理表数据为Insert语句 描述:可以传递条件精确导出sql 加条件的前提是只知道相应的字段名及类型 */ from sysobjects where name ='proc_ins ...
- 跟我一起玩转FineUI之嵌套表格
最近一直在研究FineUI(http://www.fineui.com/),那么什么是FineUI呢,FineUI是基于 ExtJS 的专业 ASP.NET 控件库.创建 No JavaScript, ...
- 【转】 memwatch使用说明书
memwatch使用说明书 1.memwatch是什么? memwatch是C语言的内存检测器.除了检测内存的功能外,它同样可以做其它的一些事情,而我们主要还是在于讲述它的基本功能.如果你真的想 ...
- jQuery自定义Web页面鼠标右键菜单
jQuery自定义Web页面鼠标右键菜单 右键菜单是固定的,很多时候,我们需要自定义web页面自定义菜单,指定相应的功能. 自定义的原理是:jQuery封装了鼠标右键的点击事件(“contextmen ...
- 网络HTTP、JSON、XML解析等 复习
一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...
- AMQ学习笔记 - 18. 持久化的测试
概述 对持久化的有效性进行测试. 测试实例 测试实例 结果预测 持久化递送 重启ActiveMQ后,消息还在队列中 非持久化递送 重启ActiveMQ后,消息不在队列中 demo设计 jms-prod ...
- JS学习笔记 -- 定时器,提示框的应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 16款最佳HTML5超酷动画演示及源码
1.HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效.HTML5 3D旋转图片相册等应用.今天我们来分享一款既炫酷又实用 ...
- ThinkPHP中的模型二
ThinkPHP中的模型 1.为什么要创建数据对象 案例:使用ThinkPHP完成部门管理 ① 设计数据库 ② 创建Dept控制器 路径:./Application/Admin/Controller创 ...