Objective-C消息发送机制原理objc_msgSend( )

0、方法调用原理
0.1、以[reciver method]为例,实际上是objc_msgSend(reciver, @selector(method), …argments);
0.2、OC方法调用转换为objc_msgSend函数调用,方法调用者、方法名为该函数的前2个参数;
0.3、OC对象本质为结构体,参考:剖析Objective-C对象本质结构MJClassInfo

1、消息发送(查找方法)
1.1、如果方法调用者为nil,直接返回(不报错);
2.2、方法调用者通过isa指针查找方法接收者,方法接收者查找对象中的cache,如果没有则查找对象中方法列表class_rw_t;
2.3、如果找到则调用并缓存在cache中,否则通过superclass在父类中的cache,class_rw_t中查找;
2.4、如果找到则调用并缓存在cache中,否则再通过superclass的superclass查找,直到superclass为空;
2.5、如果在整个继承体系中都没有找到目标方法,调用方法接收者的动态解析方法(如果解析过则进入方法转发);

2、动态解析[……]

继续阅读

剖析Objective-C对象本质结构MJClassInfo

1
2
3
4
5
6
7
8
9
10
11
//
//  MJClassInfo.h
//  TestClass
//
//  Created by MJ Lee on 2018/3/8.
//  Copyright © 2018年 MJ Lee. All rights reserved.
//
 
#import 
 
#i[......]<p class="read-more"><a href="https://www.yusian.com/blog/project/2018/11/15/1139191393.html">继续阅读</a></p>

block本质

1、写一个简单的mac命令行程序,包含block定义与使用

1
2
3
4
5
#import 
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        void (^block)(void) = ^{[......]<p class="read-more"><a href="https://www.yusian.com/blog/project/2018/11/13/0925191388.html">继续阅读</a></p>

2、在命令行下编译成c++源文件xcrun -sdk iphoneos clang -arch arm64 -rewrite[……]

继续阅读

KVO的本质

1、KVO也就是key-value-observing(键值观察),利用一个key来找到某个属性并监听其值得改变;
1.1、KVO的使用非常简单,调用实例对象的addObserver:forKeyPath:options:context:方法;
1.2、对象在相关属性发生值变化时,会调用观察者的observerValueForKeyPath:ofObject:change:context方法;
2、为什么同一个类创建出来的对象,KVO的对象在修改属性时会多调用一个观察方法?
2.1、从对象本质我们了解到,成员属性或成员方法内存中保存在类对象中,所有实例方法都一样;
2.2、既然同一个[……]

继续阅读

Objective-C中对象的分类与本质(isa&superclass)

1、OC中对象分为三种:实例对象(instance)、类对象(class)、元类对象(meta-class);
2、实例对象类型为创建该实例的类类型,类对象与元类对象均为Class类型;
3、每创建一个实例都会在内存中新创建一个实例对象,但类对象与元类对象只有一份;
4、类的成员变量值保存在实例对象中,对象方法、属性、属性类型等信息保存在类对象中,类方法保存在元类对象中;
5、所有对象都会有isa属性与superclass属性;
6、isa指针的指向为:isntance->class->meta-class;
6.1、实例对象的isa指向类对象;
6.2、类对象的isa指向元类对象;[……]

继续阅读