(一) mian.h
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
iOS程序就是从main函数开始执行的,但是在main函数中我们其实只能看到一个方法,这个方法内部是一个消息循环(相当于一个死循环),因此运行到这个方法UIApplicationMain之后程序不会自动退出,而只有当用户手动关闭程序这个循环才结束。
这个方法有四个参数:
第一个参数:参数个数
第二个参数:参数内容
第三个参数代表UIApplication类(或子类)字符串,这个参数默认为nil则代表默认为UIApplication类,用户可以自定义一个类继承于这个类;如果为nil则等价于NSStringFromClass([UIApplication class]),大家可以自己试验,效果完全一样;UIApplication是单例模式,一个应用程序只有一个UIApplication对象或子对象;
第四个参数是UIApplication的代理类字符串,默认生成的是AppDelegate类,这个类主要用于监听整个应用程序生命周期的各个事件(其实类似于之前我们文章中提到的事件监听代理),当UIApplication运行过程中引发了某个事件之后会调用代理中对应的方法;
也就是说当执行UIApplicationMain方法后这个方法会根据第三个参数创建对应的UIApplication对象,这个对象会根据第四个参数AppDelegate创建并指定此对象为UIApplication的代理;同时UIApplication会开启一个消息循环不断监听应用程序的各个活动,当应用程序生命周期发生改变UIApplication就会调用代理对应的方法。
(二)UIViewController+Swizzle.h
+ (void)load{ swizzleAllViewController(); }
void swizzleAllViewController() { Swizzle([UIViewController class], @selector(viewDidAppear:), @selector(customViewDidAppear:)); Swizzle([UIViewController class], @selector(viewWillDisappear:), @selector(customViewWillDisappear:)); Swizzle([UIViewController class], @selector(viewWillAppear:), @selector(customviewWillAppear:)); }
静态就交换静态,实例方法就交换实例方法
void Swizzle(Class c, SEL origSEL, SEL newSEL) { Method origMethod = class_getInstanceMethod(c, origSEL); Method newMethod = nil; if (!origMethod) { origMethod = class_getClassMethod(c, origSEL); if (!origMethod) { return; } newMethod = class_getClassMethod(c, newSEL); if (!newMethod) { return; } }else{ newMethod = class_getInstanceMethod(c, newSEL); if (!newMethod) { return; } } //自身已经有了就添加不成功,直接交换即可 if(class_addMethod(c, origSEL, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))){ class_replaceMethod(c, newSEL, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); }else{ method_exchangeImplementations(origMethod, newMethod); } }