__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timeFire) userInfo:nil repeats:YES];
为啥NSTimer 用weakSelf不能解决循环引用,而block就可以呢?
因为原理不一样。
在block中:
void _Block_object_assign(void *destArg, const void *object, const int flags){
const void **dest = (const void **)destArg;
switch (os_assumes(flags & BLOCK_ALL_COPY_DISPOSE_FLAGS)){
case BLOCK_FIELD_IS_OBJECT:
_Block_retain_object(object);
*dest = object;
break;
.............
}
}
首先明确一个概念,self和weakSelf指向同一块内存地址,但是它俩的指针地址是不一样的,所以是两个对象。两者同时持有,weakSelf时引用计数没有处理。
在block中,self->block->weakSelf (block里面持有的是临时变量的指针地址)
在NSTimer中,NSRunLoop->timer->weakSelf->self timer持有的是weakSelf指向的对象(self指向的对象是同一个对象),所以造成了循环引用。
如有不对之处,欢迎留言指正。