核心 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
网友评论