MLeaksFinder实现原理

在VC消失2秒之后会使用VC调用内部一个方法,如果能调用就说明VC没有被销毁,反之,VC被销毁了。

UIViewController+MemoryLeak中代码

  + (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [self swizzleSEL:@selector(viewDidDisappear:) withSEL:@selector(swizzled_viewDidDisappear:)];
    [self swizzleSEL:@selector(viewWillAppear:) withSEL:@selector(swizzled_viewWillAppear:)];
    [self swizzleSEL:@selector(dismissViewControllerAnimated:completion:) withSEL:@selector(swizzled_dismissViewControllerAnimated:completion:)];
});
}

- (void)swizzled_viewDidDisappear:(BOOL)animated {
[self swizzled_viewDidDisappear:animated];

if ([objc_getAssociatedObject(self, kHasBeenPoppedKey) boolValue]) {
    [self willDealloc];
}
}

NSObject+MemoryLeak中代码

  - (BOOL)willDealloc {
NSString *className = NSStringFromClass([self class]);
if ([[NSObject classNamesWhitelist] containsObject:className])
    return NO;

NSNumber *senderPtr = objc_getAssociatedObject([UIApplication sharedApplication], kLatestSenderKey);
if ([senderPtr isEqualToNumber:@((uintptr_t)self)])
    return NO;

__weak id weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    __strong id strongSelf = weakSelf;
    [strongSelf assertNotDealloc];
});

return YES;
}

代码中使用GCD延迟2秒执行了一个assertNotDealloc方法。

疑问:

1.在延迟执行中为什么要既使用__weak又使用__strong对self进行修饰呢?

2.在当前页面push或present的时候也会调用viewDidDisappear方法并不会销毁啊
在ViewController pop或dismiss后去调用

你可能感兴趣的:(MLeaksFinder实现原理)