美文网首页
ios中runtime使用方法交换时NSArray,NSMuta

ios中runtime使用方法交换时NSArray,NSMuta

作者: 木槿WEIXIAO | 来源:发表于2017-12-20 15:42 被阅读0次

    1.正常的方法交换代码

    + (void)load {

    [superload];

    // 通过class_getInstanceMethod()函数从当前对象中的method list获取method结构体,如果是类方法就使用class_getClassMethod()函数获取。

    Method fromMethod = class_getInstanceMethod([self class], @selector(viewDidLoad));

    Method toMethod = class_getInstanceMethod([self class], @selector(swizzlingViewDidLoad));

    method_exchangeImplementations(fromMethod, toMethod);

    }

    2.NSArray,NSMutableArray,NSDictionary,NSMutableDictionary时

    + (void)load {

    [superload];

    Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:));

    Method toMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(lxz_objectAtIndex:));

    method_exchangeImplementations(fromMethod, toMethod);

    }

    3.上面两个方法对比可知,参数发生了变化,原因:

    这是因为Method Swizzling对NSArray这些的类簇是不起作用的。因为这些类簇类,其实是一种抽象工厂的设计模式。抽象工厂内部有很多其它继承自当前类的子类,抽象工厂类会根据不同情况,创建不同的抽象对象来进行使用。例如我们调用NSArray的objectAtIndex:方法,这个类会在方法内部判断,内部创建不同抽象类进行操作。

    所以也就是我们对NSArray类进行操作其实只是对父类进行了操作,在NSArray内部会创建其他子类来执行操作,真正执行操作的并不是NSArray自身,所以我们应该对其“真身”进行操作。

    下面我们列举一些常用的类簇的“真身”:

    相关文章

      网友评论

          本文标题:ios中runtime使用方法交换时NSArray,NSMuta

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