1、ARC下打印retainCount:NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)(obj)));
或者用[obj valueForKey:@"retainCount"];
2、解决timer引起的循环引用,在viewController里的didMoveToParentViewController里把timer置为nil,还有
另外一种方法是修改target,即:
_target = [[NSObject alloc] init];
class_addMethod([_target class], @selector(fire), class_getMethodImplementation([self class], @selector(fire)), "v@:");
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:_target selector:@selector(fire) userInfo:nil repeats:YES];
第三种方法是:
self.proxy = [XCProxy alloc];//没有init
self.proxy.target = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self.proxy selector:@selector(fire) userInfo:nil repeats:YES];
第四种方法:iOS 10提供的下面方式
scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
另外的定时方式有dispatch_source,CADisplayLink,主要是timer的精度不高
3、block里内部为什么要把weakSelf再变为strongSelf是因为weakSelf的有效期一般只有30秒,当网络比较慢的时候
weakSelf可能早已变成了nil,故要再变成strongSelf
网友评论