首页 > 代码库 > IOS中Block的循环引用

IOS中Block的循环引用

@interface DemoObj()

@property (nonatomic, strong) NSOperationQueue *queue;

@end

@implementation DemoObj

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.queue = [[NSOperationQueue alloc] init];
    }
    
    return self;
}

- (void)dealloc
{
    NSLog(@"demoobj dealloc");
}

- (void)demoOp:(id)obj
{
    NSLog(@"%@ %@", [NSThread currentThread], obj);
}

- (void)demoBlockOp
{
    // 不能用__weak
//    __weak DemoObj *weakSelf = self;
    // 只有self直接强引用block,才会出现循环引用
    // block的管理以及线程的创建和销毁是由队列负责的,直接在block中使用self没有关系!
    for (int i = 0; i < 10; ++i) {
        
        [self.queue addOperationWithBlock:^{
            [self demoOp:@(i)];
        }];
    }
}

在viewcontroller里调用DemoObjdemoBlockOp方法,验证DemoObj是否会被销毁,这里是否会引起block的循环引用。

DemoObj *obj = [[DemoObj alloc] init];
[obj demoBlockOp];

事实证明这里不会引起循环引用,因为这里跟运行循环机制有关,在IOS中只有主线程设置了Run Loop,但是在其他子线程中就没有设置Run Loop的,其他线程是由队列管理的,执行完了之后就被销毁了,所以不会引起对self的强引用。

这里不能用__weak,因为使用了__weak之后,当出了demoBlockOp这个方法的"}"之后,obj对象就没有被引用了,就会释放了,就会造成demoOp方法不会被调用,或者没有完全被调用。