在类A的两个分类A00,A01调用method_swizzle方法会怎么样?

164 阅读1分钟

今天在项目中发现UIViewController有两个分类UIViewController+A 和UIViewController+B。更加神奇的是,这两个分类同时在+load方法用method_swizzle 交换了系统的viewWillAppear方法,并且交互的名字都一样,是hook_viewWillAppear。问题来了,这会造成怎么样的后果呢?

首先,分类的方法会在_dyld_objc_notify_register(&map_images, load_images, unmap_image); 中的map_images ->remethodizeClass 整合到类中,因为UIViewController+A中有和UIViewController+B 中一样的是hook_viewWillAppear方法。所以按照编译顺序,后编译的方法会被添加到类方法列表的前面,所以在通过selector 查找类方法的时候,后编译的方法会被优先查找到。

+load的方法调用在map_images ->remethodizeClass 之后,所以无论是UIViewController+A的+load方法还是UIViewController+B的+load方法,他们交换的都是后编译的那个是hook_viewWillAppear 方法。因为两次交换刚刚相互抵消,相当于没有进行任何交换。

结论:

方法在被交换之后,再执行了一次相同的交换,所以没有任何变化。