tmf框架桥接的创建都会走 invokeParameters方法,然后在这个方法打上断点,找到它上层的类及方法名,方法名是JSBridgeXXX这个,类名是invokeParametersXXX
释放的时候看注释是走complete方法
因此对这两个方法进行hook,增加监控逻辑
代码如下
.h
#import "JSBridgexxx.h"
NS_ASSUME_NONNULL_BEGIN
@interface JSBridgexxx (YYY)
@end
NS_ASSUME_NONNULL_END
.m
#import "JSBridgexxx+YYY.h"
#import <objc/runtime.h>
@implementation JSBridgexxx (YYY)
+ (void)load{
{
Method originalMethod = class_getInstanceMethod([self class], @selector(--invokeWithParametersxxx:));
Method swizzledMethod = class_getInstanceMethod([self class], @selector(--invokeWithParametersxxx));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
{
Method originalMethod = class_getInstanceMethod([self class], @selector(completS));
Method swizzledMethod = class_getInstanceMethod([self class], @selector(complet));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
-(void)---invokeWithParameters:(NSDictionary *)parameters xxx{
NSString *webStr = [NSString stringWithFormat:@"%@",self.webViewController];
NSString *bridgeStr = [NSString stringWithFormat:@"%@",self];
NSLog(@"%@本次创建的桥接:%@",webStr,bridgeStr);
NSMutableDictionary *mu = [[NSThread mainThread] threadDictionary];
NSMutableArray *bridges = ((NSArray*)[mu objectForKey:webStr]).mutableCopy;
if(bridges == nil) bridges = [[NSMutableArray alloc] initWithCapacity:10];
[bridges addObject:bridgeStr];
if(bridges && webStr) [[[NSThread mainThread] threadDictionary] setObject:bridges forKey:webStr];
NSLog(@"%@创建的所有桥接:%@",webStr,bridges);
[self ---invokeWithParametersxxx];
}
- (void)completS{
NSString *webStr = [NSString stringWithFormat:@"%@",self.webViewController];
NSString *bridgeStr = [NSString stringWithFormat:@"%@",self];
NSLog(@"%@本次释放的桥接:%@",webStr,bridgeStr);
NSMutableDictionary *mu = [[NSThread mainThread] threadDictionary];
NSMutableArray *bridges = ((NSArray*)[mu objectForKey:webStr]).mutableCopy;
[bridges removeObject:bridgeStr];
if(bridges == nil){
[[[NSThread mainThread] threadDictionary] setObject:@[@"空数据占位用"] forKey:webStr];
}
if(bridges && webStr){
[[[NSThread mainThread] threadDictionary] setObject:bridges forKey:webStr];
}
NSLog(@"%@还未释放的桥接:%@",webStr,bridges);
[self completS];
}
@end