NSTimer 为啥容易造成循环引用

__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指向的对象是同一个对象),所以造成了循环引用。

如有不对之处,欢迎留言指正。

你可能感兴趣的:(NSTimer 为啥容易造成循环引用)