美文网首页
3-4 super self 和 Method-Swizzlin

3-4 super self 和 Method-Swizzlin

作者: Rumbles | 来源:发表于2019-04-02 16:54 被阅读0次

1 .super,isKindOfClass,isMemberOfClass 2336684744

[self class]. 打印的是Student
通过实例对象的isa指针找到找到其类对象,所以打印是Student。

[super class] 打印的也是 Student
因为super。的消息接受者还是 self。super仅仅指的是从父类寻找方法


[super superclass]

这个其实和第二个的情况是一样的,给student对象发送@selector(superclass)消息,但是superclass的实现要从父类Person类的类对象开始找起,但是superclass的实现是基类NSObject类实现的,所以从Student类的类对象和Person类的类对象开始查是没有区别的。最终输出都是student对象的父类对象,打印结果是Person。

class:获取方法调用类名
superclass:获取方法调用者的父类类名
super:编译修饰符,不是指针,指向父类标志

2.方法交换 Method-Swizzling

+ (void)load {
    Method *test = class_getInstanceMethod(self, @selector(test));
    Method *test2 = class_getInstanceMethod(self, @selector(test));
    
    ////> 交换两个方法的实现
    method_exchangeImplementations(test, test2);
}

- (void)test2 {
    [self test2];
}

3.方法交换 使用场景

1.统计页面曝光率
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [MethodSwizz swizzWithClass:[self class] originSel:NSSelectorFromString(@"dealloc") newSel:@selector(swizz_dealloc)];
    });
}

- (void)swizz_dealloc{
    
    NSLog(@" ** %@ 释放了 %s",NSStringFromClass([self class]),__func__);
    
//    [self swizz_dealloc];
}

所有的控制器都会走这个方法

2.方法交换 来预防崩溃
把所有可能崩溃的方法 都 交换方法
- (void)avoidCrashSetValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues {
    @try {
        [self avoidCrashSetValuesForKeysWithDictionary:keyedValues];
    }
    @catch (NSException *exception) {
        NSString *defaultToDo = AvoidCrashDefaultIgnore;
        [self noteErrorWithException:exception defaultToDo:defaultToDo];
    }
    @finally {
    }
}

@try里面是正常的方法 
@catch 里面是崩溃的方法。崩溃后我们会走另外一个方法 可以收集崩溃信息




- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
NSMethodSignature *signature = [super methodSignatureForSelector:sel];

if (!signature) {
    NSLog(@"*******%@ - %@ ***un reconize selector %s!",NSStringFromClass([self class]),NSStringFromSelector(sel),__func__);
    signature = [NSMethodSignature signatureWithObjCTypes:@encode(void)];
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)invocation {
- }

利用消息转发 来处理 没有找到方法的崩溃问题

4.动态的添加方法

消息转发流程3步
消息转发的第一步:resolveInstanceMethod:(SEL)sel

+ (BOOL)resolveInstanceMethod:(SEL)sel{
    if (sel == @selector(resolveMethod)) {
        Method method = class_getInstanceMethod(self, @selector(test2));
        ///> 这个方法
        class_addMethod(self, sel, method_getImplementation(method), "v16@0:8");
        return YES;
    }
    
    return [super resolveInstanceMethod:sel];
}

4.动态的方法解析

@dynamic
动态运行时语言将函数决议推迟到运行时
编译时语言在编译期进行函数决议

runtime是如何通过高selector找到imp地址
就是消息传递流程

能否先编译后的类添加实力变量
不能

能否向动态添加的类添加实力变量

相关文章

  • 3-4 super self 和 Method-Swizzlin

    1 .super,isKindOfClass,isMemberOfClass 2336684744 2.方法交换 ...

  • Lesson 0-2 Objective-C basic

    11.self 和 super self代表一个指针,super是一个编译器指示符,self 和 super 都指...

  • self和super的区别

    self和super的区别 self调用自己方法,super调用父类方法 self是类,super是预编译指令 [...

  • class

    1.[self class]和 [super class] self和super的区别: self是类的一个隐藏参...

  • Objective-C self与super的区别

    Objective-C self与super的区别 [self class] 和 [super class] 在当...

  • 单继承

    父类.方法(self,*args)和super(父类名,self).方法 当super(父类名,self).方法 ...

  • self、 superclass 、 super的区别

    self、 superclass 、 super的区别 self、 superclass 、 super self...

  • super

    示例 self [self class]、[self superclass]调用流程 super [super c...

  • self 和 Super

    刨根问底Objective-C Runtime(1)- Self & Super 下面的代码输出什么? @impl...

  • self和super

    本人主要介绍一下在OC中最常用的两个关键字self和super,它们常用在对象初始化方法里。不知道大家有没有想过研...

网友评论

      本文标题:3-4 super self 和 Method-Swizzlin

      本文链接:https://www.haomeiwen.com/subject/gypbvqtx.html