iOS開發(fā)中block直接強引用和先弱引用再強引用的區(qū)別

直接強引用

可能造成循環(huán)引用
如果沒有循環(huán)引用,強引用的對象需要等待block銷毀了才能隨之銷毀。

先弱引用再強引用(一般在有循環(huán)引用的地方使用)

弱引用可以避免循環(huán)引用

舉例:
某個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秒之后調(diào)用:%@", 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秒之后調(diào)用:%@", strongSelf);
            [strongSelf testStrong];
        });
    };

第一段代碼在4秒之后self調(diào)用完testStrong方法之后仍沒有銷毀,造成了循環(huán)引用。而第二段代碼在4秒strongSelf在調(diào)用完testStrong方法之后就被銷毀了,沒有造成循環(huán)引用。

區(qū)別

先弱引用再強引用:第一次的弱引用,打破了循環(huán)引用的條件,第二次的強引用,等block銷毀后,block就不再對self進行強引用了。第二次的強引用是對weakSelf進行的強引用,此變量是存儲在弱引用表中的,對block沒有強引用,strongSelf和block沒有形成循環(huán)引用。

iOS開發(fā)中在block中為什么要__weak和__strong配合使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容