直接強引用
可能造成循環(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)引用。