- 博客(11)
- 收藏
- 关注
原创 IOS开发之category(load,initialize)
因为category是把自己的实现向后偏移,前面是分类的实现,又因为是从后遍历分类插入到method的前面,所以后编译的分类,先调用,如果这个分类没有实现这个方法,会找其他分类,如果也没有再找自己的实现,如果都没有回通过isa向上找,这个位置就不详细介绍了,在其他文章有介绍。load方法会调用自己的父类,然后调用自己的分类,如果不是继承关系则跟编译顺序有关,并且如果先调用父类的load方法,再调用自己的时候就不调用父类的load方法了,因为load方法只调用一次。
2025-01-27 14:35:28
870
原创 IOS开发之category
category的底层是将原来的方法向后移动,并且将分类的方法放到前面,后参与编译的分类优先调用,也就是放到二维数组的前面。
2025-01-27 09:54:00
470
原创 IOS开发之KVC
调用setValue:forKey: 先按照setKey、_setKey:顺序查找方法,如果找到了方法直接调用,如果没找到方法,查看accessInstanceVariablesDirectly方法的返回值(表示是否可以直接方法变量),如果返回NO,抛出异常,如果返回YES, 按照 _key、_isKey、key、isKey顺序查找成员变量,找到了直接赋值,找不到成员变量抛出异常。直接给出一个KVC的例子。
2025-01-23 23:04:58
353
原创 IOS开发之KVO
KVO的本质实际上是把instance的isa指针原本指向类对象的指针指向了一个runtime动态生成的类,名为NSKVONotifying_XXXX 的类,这个类会调用 Foundation 的 _NSSetXXXValueAndNotify函数,新生成的这个类的isa指向原本 instance对象指向的类对象。当监听的某个属性发生变化时,将执行相应的动作,有点类似于C++中函数指针的回调操作,但是有些不同。KVO全称为key-value observer 也就是键值监听。
2025-01-22 22:47:05
624
原创 IOS开发之Runtime(三)
第2阶段: 有一个bool类型的变量标记是否进入过动态方法解析阶段,如果为true进入第3阶段消息转发,如果为false,调用 +resolveInstanceMethod: 或者+resolveClassMethod: 方法来动态解析方法,标记为已经动态解析,再次进入第1阶段消息发送,如果走完第1个阶段还是没有解决,此时这个bool类型的变量为true,直接进入第3阶段消息发送。forwardingTargetForSelector:方法,有实例方法也有类方法。objc_msgSend的汇编。
2024-12-24 22:40:56
540
原创 IOS开发之Runtime(二)
method_array_t实际上是一个二维数组,里面存储的是一维数组,再里面是方法,二维数组指向的一维数组可能包含几个分类的方法最后是类的方法,分类的方法要在类方法的前面 这样可以动态的往里面增加方法和修改方法。class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始化内容、分类的内容。methods里面存储的是类的和分类的方法列表,如果是类存储的是实例方法,meta-class存储的是类方法。method_t是对方法或函数的封装。
2024-12-22 18:00:08
920
原创 IOS开发之Runtime(一)
define ISA_MASK 0x007ffffffffffff8ULL =》 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000 可以看到转换二进制后 后三位全是0,所以class类,meta-class类的十六进制地址应该为0或者8结尾。isa指针需要通过与一个叫ISA_MASK的值(掩码)进行二进制&运算,才能得到真实的class/meta-class对象的地址。
2024-12-21 16:26:35
718
原创 IOS开发之Block(三)
当block被拷贝到堆上,会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会根据auto变量的修饰符(_strong、_weak、_unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用。转换为cpp代码,这里weak转换为cpp代码的时候需要加上:-fobjc-runtime=ios-x.x.x。在ARC环境下Person对象出了作用域调用析构。
2024-12-15 12:58:34
273
原创 IOS开发之Block(二)
(_NSConcreteMallocBlock) __NSStackBlock__调用了copy copy:引用计数增加。NSConcreateGlobalBlock) 没有访问auto变量 程序的数据区域 copy:什么也不做。block有3种类型,可以调用class方法或者isa指针查看具体的类型,最终都继承NSBlock类型。NSConcreateStackBlock) 访问了auto变量 栈 copy:从栈复制到堆。
2024-12-12 22:45:34
363
原创 IOS开发之Block(一)
局部变量:会捕获到block的内部,访问方式为值传递,但是如果是static类型也会捕获到block内部,但是此时是指针传递全局变量:不会捕获到block内部,可以直接访问。
2024-12-11 22:34:05
306
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅