一、Runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)
每一个类对象中都一个方法列表,方法列表中记录着方法的名称、方法实现、以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现。
二、使用Runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?
objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
最后这个参数有如下几个:
OBJC_ASSOCIATION_ASSIGN
OBJC_ASSOCIATION_RETAIN_NONATOMIC
OBJC_ASSOCIATION_COPY_NONATOMIC
OBJC_ASSOCIATION_RETAIN
OBJC_ASSOCIATION_COPY
无论ARC或MRC,根据我们的具体需要设置,都不需要在主对象dealloc的时候释放。
三、objc中的类方法和实例方法有什么本质区别和联系?
类方法:
1、类方法是属于类对象
2、类方法只能通过类对象调用
3、类方法中的self是类对象
4、类方法可以调用其他的类方法
5、类方法中不能访问成员变量
6、类方法中不能直接调用对象方法
7、类方法是存储在元类对象的方法缓存中
实例方法:
1、实例方法是属于实例对象
2、实例方法只能通过实例对象调用
3、实例方法中的self是实例对象
4、实例方法中可以访问成员变量
5、实例方法中直接调用实例方法
6、实例方法中可以调用类方法(通过类名)
7、实例方法是存储在类对象的方法缓存中
四、_objc_msgForward函数是做什么的?直接调用它会发生什么?
_objc_msgForward是用于消息转发的,当向一个对象发送一条消息,这个对象并没有实现的时候,_objc_msgForward会尝试做消息转发。
直接调用_objc_msgForward很危险,如果用不好会导致程序crash,用的好很棒。
JSPatch就是直接调用_objc_msgForward来实现其核心功能
五、Runtime如何实现weak变量的自动置nil?
因为编译后的类已经注册在Runtime中,类结构体中的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,同时Runtime会调用class_setIvarLayout或class_setWeakIvarLayout来处理strong、weak引用,所以不能向存在的类中添加实例变量。
运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用objc_allocateClassPair之后objc_registerClassPair之前,原因同上。