isa指针
isa指针指的就是类自己本身 实例对象通过对象的isa指针指向类 是一个class 类型的指针,每个实例对象都有 isa 指针,他指向对象的类
Class 是一个 objc_class 结构类型的指针, id是一个 objc_object 结构类型的指针.
https 加密
非对称加密交换秘钥,对称通信
服务端 生成一对私钥和公钥
发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,
然后对方用自己的私钥解密拿到“对称的密钥”,
这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信
链式编程
什么是链式编程,一句话就是方法返回值必须要有方法的调用者!
weak 原理说明
一个对象可能会被多次弱引用,当这个对象被销毁时,我们需要找到这个对象的所有弱引用,所以我们需要将这些弱引用的地址(即指针)放在一个容器里(比如数组)。当对象不再被强引用时需要销毁的时候,可以在SideTable中 通过这个对象的地址找到引用值,清空引用值。同时, SideTable结构中还有weak_table_t结构,该结构也是一个散列表,key 为对象地址,value 为一个数组,里面保存着指向该对象的所有弱指针。当对象释放的时候,先清空引用哈希表RefcountMap对应的引用值,遍历弱指针数组,依次将各个弱指针置为 nil。
内存(堆内存)回收是什么意思
NSObject *obj = [[NSObject alloc] init]
代码对应的内存布局如下,obj 指针存在于栈取,obj 对象存在于堆区。obj 指针的回收由栈区自动管理,堆区的内存需要开发者自己管理(MRC)情况。所谓的堆内存回收并不是指将 obj 对象占有的内存给挖去或是将空间数据清空为0,而是指 obj 对象原本占有的空间可以被其他人利用(即其他指针可以指向该空间)。其他指针指向该空间时,重新初始化该空间,将空间原有数据清零。
签名机制
[super class]
super 调用底层会转换为objc_msgSendSuper函数的调用,objc_msgSendSuper 函数接收 2 个参数 objc_super 结构体和 SEL ,objc_super结构如下:
struct objc_super {
__unsafe_unretained _Nonnull id receiver; // 消息接收者
__unsafe_unretained _Nonnull Class super_class; // 消息接收者的父类
};
[super class] 在调用过程中,底层转化为 objc_msgSendSuper({self, [Animal class]}, @selector(class)); ,同 objc_msgSend 函数相比相当于多了第二个参数,但消息接收者仍然是 self ,所以打印结果为 Cat。
由此可见 当我们调用[self class] 时候实际上编译器最终给我们转成 objc_msgSend(self,@selector(class)) , 消息的接收者是当前所在类的实例对象 , 这个时候就会去 self 所在类 Student 去查找 class 方法 , 如果当前类 Student 没有 class 会向Student 父类 Person 类找 class 方法, 如果 Person 类也没有找到 class 方法,最终会找到最顶级父类 NSObject 的 class 方法, 最终找到 NSObject 的 class 方法 ,并调用了object_getClass(self) ,由于消息接收者是 self 当前类实例对象, 所以最终 [self class]输出 Student