2019runtime相关

2021-04-07  本文已影响0人  i爱吃土豆的猫
一、数据结构:objc_object,objc_class,isa,class_data_bits_t,cache_t,method_t
image.png
二、实例对象 类对象 元类对象

superClass是一层层继承的,到最后NSObject的superClass是nil.而NSObject的isa指向根元类,这个根元类的isa指向它自己,而它的superClass是NSObject,也就是最后形成一个环

三、消息传递
void objc_msgSend(void /* id self, SEL op, ... */ )

void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )

struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained _Nonnull id receiver;

/// Specifies the particular superclass of the instance to message. 
#if !defined(__cplusplus)  &&  !__OBJC2__
/* For compatibility with old objc-runtime.h header */
__unsafe_unretained _Nonnull Class class;
#else
__unsafe_unretained _Nonnull Class super_class;
#endif
/* super_class is the first class to search */
};

消息传递的流程:缓存查找-->当前类查找-->父类逐级查找

四、消息转发
+ (BOOL)resolveInstanceMethod:(SEL)sel;//为对象方法进行决议
+ (BOOL)resolveClassMethod:(SEL)sel;//为类方法进行决议
- (id)forwardingTargetForSelector:(SEL)aSelector;//方法转发目标
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
- (void)forwardInvocation:(NSInvocation *)anInvocation;
image.png

那么最后消息未能处理的时候,还会调用到- (void)doesNotRecognizeSelector:(SEL)aSelector这个方法,我们也可以在这个方法中做处理,避免掉crash,但是只建议在线上环境的时候做处理,实际开发过程中还要把异常抛出来

应用场景:替换系统的方法,比如viewDidLoad,viewWillAppear以及一些响应方法,来进行统计信息

上一篇 下一篇

猜你喜欢

热点阅读