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; /** * 进入 ...
随机推荐
- html5 Canvas API
详细内容请点击 1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好:其次,在其他编程语言现有的优秀二维绘图API的基础上实现C ...
- django 学习-12 Django表单 初步
1.先创建项目和应用 django.admin.py startproject cs cd cs django.admin.py startapp blog 2.vim setti ...
- C#传递参数
与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法 C#中的参数修饰符 无修饰 如果一个参数没有用参数修饰符,则认为它将按值传递 out 输出参数由被调用的方法赋值. ...
- UI2_QQ折叠-UITableViewController
// CustomUITableViewController.h // UI2_QQ折叠-UITableViewController // // Created by zhangxueming on ...
- js、expression表达式解析
首先理解一下下面的表达式:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeigh ...
- WAS缓存导致修改文件不生效问题
当用ftp上传部署增量文件,was应用不生效问题解决方法:一. 修改web.xml文件,需要修改以下三个目录下的文件:1. /opt/IBM/WebSphere/AppServer/profiles/ ...
- 为apache与mysql创建快捷方式
为apache与mysql创建快捷方式 1)为apache创建快捷方式(软链接) 以后我们就可以在终端的任一位置,使用apachectl start|stop|restart 2)为mysql创建 ...
- HashMap 读后感
HashMap是一个哈希表,内部通过链地址法解决哈希冲突.内部用Entry数组保存数据,每个Entry是一个单向链表. HashMap不保证插入的顺序,线程不同步,允许null 下面是几个重要点: 保 ...
- IAR产生可烧录的镜像文件
Technorati 标签: IAR 烧录镜像 在IAR中,产生能够使用烧录器烧写的hex文件的方法: 1. 只生成可烧写的hex文件: 1.1 在Project Option中的Link ...
- 【风马一族_Android】Android学习
如果是色彩盲,请自行收藏这个网站:Material Design Color Palette Generator 所有书上的UI部分扫一遍就行了,我相信现在还没有书按material design标准 ...