美文网首页
iOS中runtime的使用场景

iOS中runtime的使用场景

作者: iOneWay | 来源:发表于2017-10-19 23:47 被阅读19次

1,全局统计用户进入页面的次数

创建UIViewController分类替换ViewDidLoad方法实现

#import <Foundation/Foundation.h>

@interface NSObject (Swizzling)

+(void)methodSwizzlingWithOriginalSelector:(SEL)originalSelector bySwizzledSelector:(SEL)swizzledSelector;
@end

#import "NSObject+Swizzling.h"
#import <objc/runtime.h>
@implementation NSObject (Swizzling)

+(void)methodSwizzlingWithOriginalSelector:(SEL)originalSelector
                       bySwizzledSelector:(SEL)swizzledSelector{

   Class class = [self class];
   Method originalMethod = class_getInstanceMethod(class, originalSelector);
   Method swizzleMethod = class_getInstanceMethod(class, swizzledSelector);

   BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod));
   if (didAddMethod) {
       class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
   }else{
       method_exchangeImplementations(originalMethod, swizzleMethod);
   }
}
@end
@implementation UIViewController (Swizzling)
+(void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [UIViewController methodSwizzlingWithOriginalSelector:@selector(viewDidLoad)
                                           bySwizzledSelector:@selector(swizzling_viewDidLoad)];

    });
    }
-(void) swizzling_viewDidLoad{
    [self viewDidLoad];
    NSLog(@"===== %@ viewDidAppear=====",[self class]);
}
@end
Swizzling应该总在+load中执行

在OC中,Runtime会在类初始加载时调用+load方法,在类第一次被调用时实现+initialize方法。由于Method Swizzling会影响到类的全局状态,所以要尽量避免在并发处理中出现竞争情况。+load方法能保证在类的初始化过程中被加载,并保证这种改变应用级别的行为的一致性。

要使用dispatch_once执行方法交换

方法交换要求线程安全,而且保证在任何情况下只能交换一次。

使用场景后续继续跟新

相关文章

  • iOS中runtime的使用场景

    1,全局统计用户进入页面的次数 创建UIViewController分类替换ViewDidLoad方法实现 Swi...

  • iOS runtime 使用场景

    runtime的功能很强大,包含的的内容也很多,见下图 但是我们平时项目中使用的并不是很多,以下是几种常见的场景:...

  • iOS底层原理——runtime

    runtime runtime 是iOS的运行时,用于实现iOS加载和调用属性和方法。 函数中load方法没有使用...

  • Runtime应用--给分类添加属性

    iOS面试经常会被问到:你有用过Runtime吗? 使用Runtime做过什么? 开发中我们会经常使用分类,知道分...

  • iOS知识梳理8:万恶的Runtime

    本文中所使用的参考链接:ios开发-Runtime详解ios Runtime几种基本用法简记iOS运行时详解ios...

  • iOS进阶回顾

    runtime的介绍和使用 我们先在官方文档中查看,这个iOS中的黑魔法,runtime(运行时)底层C语言库,包...

  • iOS开发 runtime使用场景

    1. 消息 2. 获取所有方法,变量 3. 交换方法(AOP) 4. 分类添加成员 5. kvc的实现 6. 归档的实现

  • iOS探究 --- Runtime的使用场景

    一,字典转模型 经典的第三方库MJExtensionhttps://www.jianshu.com/p/9b0b7...

  • iOS开发runtime的使用场景

    1、Method Swizzling(动态方法交换)Method Swizzling用于改变一个已存在的selec...

  • iOS runtime的使用场景-实战篇

    本文参考pingpong的iOS runtime 的使用场景--实战篇非常感谢该作者 1.背景知识 1.1 OC的...

网友评论

      本文标题:iOS中runtime的使用场景

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