NSTimer循环引用
由于NSTimer会对target进行强引用,这里我们传入的target就是当前控制器,然而当前控制器self中我们定义了一个timer的指针来强引用了timer,所以这两个对象就造成了循环引用,如下图
既然我们知道了循环引用的原因,那么我们就来解决一下这个循环引用问题
解决方案一
我们尝试让NSTimer对target弱引用就行了呗。开搞
// 让 timer 对self 产生弱引用
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:weakSelf selector:@selector(test) userInfo:nil repeats:YES];
然并卵!!! 遗憾的是这个依然不能解决,原因就是当我们使用__weak把self转为弱指针的时候,这个只有在Block变脸捕获的时候才生效。所以这里我们应该使用NSTimer的block方法。
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf test];
}];
这些方法的区别,做什么的?
objc_getMetaClass
:获取元类。
class_getInstanceMethod
:获取实例方法。苹果官方文档的定义是:如果在传入的类或者类的父类中没有找到指定的实例方法,则返回NULL。
class_getClassMethod
:获取类方法。苹果官方文档的定义是:如果在传入的类或者类的父类中没有找到指定的类方法,则返回NULL。
class_getMethodImplementation
:获取方法的具体实现,如果未查找到,则进行消息转发,之后再详细解析。
isKindOfClass
可用于判断对象是否是一个类的成员,或者是该派生类的成员
isMemberOfClass可用于判断对象是否是当前类的成员