美文网首页iOS 开发 iOS Developer
无代码入侵,获取AppDelegate声明周期

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

作者: 戴晨惜 | 来源:发表于2016-09-29 10:54 被阅读110次

    源码

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

    • 当注册需要获取AppDelegate回调的类/对象时,会保存类/对象,在系统调用AppDelegate方法时,会先替换之后的方法,在此方法内调用原先方法,而且遍历注册的类/对象调用与AppDelegate同名方法

      • 同名方法需要注意,注册为实例时,方法为 - (BOOL)···
      • 注册为类时,方法为 + (BOOL)···
    • 注意:当注册对象为实例时,此单粒会持有此对象,不释放

    • 另外TY_Appdelegate_method_return(self,_cmd,application,url,nil,nil)方法参数个数怎么设为动态,有知道的大神,指教下

    // 核心方法
    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
    
    

    相关文章

      网友评论

        本文标题:无代码入侵,获取AppDelegate声明周期

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