1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员变量和isa指针,存放在了类的对象中;isa指针指向了类对象:如图: 3:类本身也是对象,是class类型的对象: // 以person为例 Person *p1 = [[Person alloc] init]; Person *p1 = [[Person alloc] init]; // 获取类对…
一.load方法特点: 1. 当类被引用进程序的时候会执行这个函数 2.一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. 3.Category的load也会收到调用,但顺序上在主类的load调用之后.如果一个类有多个分类,分类的load调用顺序是根据编译器编译的顺序执行的. 二.initialize方法特点: 1. initialize的自然调用是在第一次主动使用当前类的时候 2.和load不同,即使子类不实现initialize方法,会把父类的实现继承过…
Category原理 - Category编译之后的底层结构是 struct categroy_t,里面存储着分类对象方法.属性.协议信息- 当程序运行时,通过runtime动态的将分类的方法.属性.协议合并到一个大数组中- 底层使用的是二维数组进行存储,比如:[[分类2方法列表],[分类1方法列表],[原方法列表]]- 将合并后的分类数据(方法.属性.协议)的数组插入到类原来数据的前面,如上- 因为它遍历分类是按倒序遍历的,所有越后面参与编译的Category数据,会在数组的前面  源码的的…
  一.load 方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法. load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法. 在项目中使用的一些场景: 比如我们要统计所有页面(UIViewController.UITableViewController)的数据,可以在UIViewController的类别里的load方法里实现Method Swizzle @implementation UIViewController (BaseM…
+ (void)initializeDescription(描述)    Initializes the class before it receives its first message. 在这个类第一次接受信息之前初始化这个类. The runtime sends initialize to each class in a program just before the class, or any class that inherits from it, is sent its first…
全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两个方法就是load和initialize两个类方法,本篇文章就对这两个方法做下说明和整理. 1.概述 Objective-C作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用. 在应用程序运行起来的时候,类的信息会有加载和初始化过程.其实在Ja…
+load() 当类被加载入程序的时候会执行+load方法 +initialize() 当类第一次被使用的时候会执行+initialize方法 这两个方法都只会被执行一次.…
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得有帮助还望点个关注以示支持,总结在文章末尾. 先来看看NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each class in a program exactly one ti…
一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中只调用一次. 调用顺序: 先调用类的+load 按照编译先后顺序调用(先编译,先调用) 调用子类的+load之前会先调用父类的+load 再调用分类的+load 按照编译先后顺序调用(先编译,先调用) 二.为什么原本类的+load方法不会被分类的+load方法覆盖呢? 这是由于+load方法是根据方…
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. initialize方法的调用时机,当向该类发送第一个消息(一般是类消息首先调用,常见的是alloc)的时候,先调用类中的,再调用类别中的(类别中如果有重写):如果该类只是引用,没有调用,则不会执行initialize方法.两者方法的共同点:自动调用父类的,不需要super…