iOS中runtime的使用场景

2017-10-19  本文已影响19人  iOneWay

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执行方法交换

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

使用场景后续继续跟新

上一篇 下一篇

猜你喜欢

热点阅读