iOS 开发 iOS Developer

无代码入侵,获取AppDelegate声明周期

2016-09-29  本文已影响110人  戴晨惜

源码

核心 runtime 方法添加/替换 UIApplication delegate 回调

// 核心方法
void Swizzle(Class class, SEL originalSelector, Method swizzledMethod)
{
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    SEL swizzledSelector = method_getName(swizzledMethod);

    BOOL didAddMethod =
    class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));
    
    if (didAddMethod && originalMethod) {
        class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}


说明


/** 
 
 需要收到 AppDelegate 的类或者对象直接调用注册方法
 
 或者使用 宏 TY_RegisterAppDelegate_Load 重写load方法注册  注意 此宏后面需要加 “ { } ” 
 
 注册完成之后 在实现文件内声明 AppDelegate 同名方法,就会同步调用
 
 */

#import <UIKit/UIKit.h>

#define TY_RegisterAppDelegate_Load \
+ (void)load { \
    [TYModule registerAppDelegateClass:[self class]]; \
    if ([self respondsToSelector:@selector(TY_load)]) { \
        [self performSelector:@selector(TY_load)]; \
    } \
} \
+ (void)TY_load \

@interface TYModule : NSObject

/** 根据class注册 appdelegate 的方法调用 推荐用这个 */
+ (void)registerAppDelegateClass:(nonnull Class)cla;

/** 根据对象注册 appdelegate 的方法调用 注册后会持有该对象,酌情使用<单例的话就无所谓了> */
+ (void)registerAppDelegateObject:(nonnull id)obj;

@end

上一篇下一篇

猜你喜欢

热点阅读