近期在review同事的代码时,发现一大问题,几乎每个viewController的dealloc方法都没调用,也就是说几乎每个viewController都存在着内存泄露
然后就是每个viewController一个个的改,写上dealloc方法,在里面打印信息看此方法是否调用,做到一半时,我发现工作量有点大,一个工程有好多个viewController,每个viewController都写一遍dealloc方法实在太烦琐了,于是在想能否统一在一个地方写一个dealloc方法,统一打印释放的信息。
思来想去,用运行时最好不过了,思路是写一个ViewController的类别方法myDealloc,在此方法里打印释放的信息,再与dealloc方法交换,代码如下
@interface UIViewController (MethodExchange)
@end
@implementation UIViewController (MethodExchange)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self hackForDealloc];
});
}
+ (void)hackForDealloc {
[[self class] jr_swizzleMethod:NSSelectorFromString(@"dealloc") withMethod:@selector(myDealloc) error:nil];
}
- (void)myDealloc{
SLLog(@"%@ dealloc", [self class]);
[self myDealloc];
}
这里我用到了
JRSwizzle
这个第三方库来交换类的方法,大功告成!以后就可以很方便地查看ViewController是否被释放了,再也不用写不必要的dealloc方法了(注:如果个别viewController有在Notification里注册通知的,还是需要在dealloc方法里remove掉的)