runtime---实例对象、类对象与元类对象&消息传递&消息转

2018-12-24  本文已影响0人  滨滨_57b5

类对象与元类对象的区别和联系

当调用的类方法没有时,但是有同名的实例方法存在,那么会不会导致崩溃?

消息传递流程


NS_ASSUME_NONNULL_BEGIN

@interface Mobile : NSObject

@end

NS_ASSUME_NONNULL_END


#import "Mobile.h"

@implementation Mobile

@end
#import "Mobile.h"

NS_ASSUME_NONNULL_BEGIN

@interface Phone : Mobile

@end

NS_ASSUME_NONNULL_END

#import "Phone.h"

@implementation Phone
- (instancetype)init {
    self = [super init];
    if (self) {
        NSLog(@"%@",NSStringFromClass([self class])); //self isa指向类对象Phone ->NSObject类对象方法列表
        NSLog(@"%@",NSStringFromClass([super class])); //super isa指向类对象
    }
    return self;
}
@end

消息传递流程图.png

消息传递--缓存查找流程

消息传递--当前类对象中的查找流程

消息传递--父类逐级查找流程

消息转发流程

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface RuntimeObject : NSObject

- (void)test;

@end

NS_ASSUME_NONNULL_END


#import "RuntimeObject.h"

@implementation RuntimeObject

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == @selector(test)) {
        return NO;
    }else {
        return [super resolveInstanceMethod:sel];
    }
}

- (id)forwardingTargetForSelector:(SEL)aSelector {
    return nil;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    
    if (aSelector == @selector(test)) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }else {
        return [super methodSignatureForSelector:aSelector];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    
}
@end
上一篇 下一篇

猜你喜欢

热点阅读