iOS开发中block直接强引用和先弱引用再强引用的区别

直接强引用

可能造成循环引用
如果没有循环引用,强引用的对象需要等待block销毁了才能随之销毁。

先弱引用再强引用(一般在有循环引用的地方使用)

弱引用可以避免循环引用

举例:
某个VC有一个Person类型的属性p,p的block对当前VC进行了引用。
p的block对VC直接强引用:

self.p = [[Person alloc] init];
self.p.name = @"1";
self.p.block = ^{
        __strong id strongSelf = weakSelf;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"4秒之后调用:%@", self);
            [self testStrong];
        });
    };

p的block先对VC进行弱引用,再进行强引用:

self.p = [[Person alloc] init];
    self.p.name = @"1";
    __weak typeof(self) weakSelf = self;
    self.p.block = ^{
        __strong id strongSelf = weakSelf;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"4秒之后调用:%@", strongSelf);
            [strongSelf testStrong];
        });
    };

第一段代码在4秒之后self调用完testStrong方法之后仍没有销毁,造成了循环引用。而第二段代码在4秒strongSelf在调用完testStrong方法之后就被销毁了,没有造成循环引用。

区别

先弱引用再强引用:第一次的弱引用,打破了循环引用的条件,第二次的强引用,等block销毁后,block就不再对self进行强引用了。第二次的强引用是对weakSelf进行的强引用,此变量是存储在弱引用表中的,对block没有强引用,strongSelf和block没有形成循环引用。

iOS开发中在block中为什么要__weak和__strong配合使用

你可能感兴趣的:(iOS开发中block直接强引用和先弱引用再强引用的区别)