美文网首页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