美文网首页
iOS runtime重新学习

iOS runtime重新学习

作者: iOS开发小学生 | 来源:发表于2018-11-22 17:36 被阅读6次

runtime在iOS开发中被俗称《黑魔法技术》,听起来好高大上,好难的技术,其实并没有我们想象的那么难,接下来,一步一步来重新认识它的真面目。
第一 runtime的方法替换
1.种写法
+(void)load{
//获取两个类的方法
Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
Method m2 = class_getClassMethod([UIImage class], @selector(ll_imageName:));
//开始交换方法实现
method_exchangeImplementations(m1, m2);
}

2.种写法
+(void)load{
NSString *className = NSStringFromClass(self.class);
NSLog(@"classname %@", className);
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//要特别注意你替换的方法到底是哪个性质的方法
// When swizzling a Instance method, use the following:
// Class class = [self class];

    // When swizzling a class method, use the following:
    Class class = object_getClass((id)self);

    SEL originalSelector = @selector(systemMethod_PrintLog);
    SEL swizzledSelector = @selector(ll_imageName);

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
});

}

相关文章

网友评论

      本文标题:iOS runtime重新学习

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