1.在Block中一起使用weakSelf與strongSelf的含義
我們都會(huì)聲明一個(gè)弱引用在block中使用, 目的就是防止循環(huán)引用,? 那么weakSelf與strongSelf一起使用目的是什么呢? 首先先定義2個(gè)宏:
#defineLRWeakSelf(type)? __weak typeof(type) weak##type = type;
#defineLRStrongSelf(type)? __strong typeof(type) type = weak##type;
我們創(chuàng)建一個(gè)shop并且在shop.myBlock代碼塊中使用弱引用LRWeakSelf(shop);
LRShop *shop = [[LRShop alloc]init];? ? shop.string= @"welcome to our company";//弱引用LRWeakSelf(shop);? ? shop.myBlock = ^{? ? ?NSLog(@"%@",weakshop.string);? ?
};?
shop.myBlock();
LRWeakSelf(shop);與LRStrongSelf(shop);一起使用
LRShop *shop = [[LRShop alloc]init];
shop.string= @"welcome to our company";//弱引用
LRWeakSelf(shop);? ?
shop.myBlock = ^{
//強(qiáng)引用
LRStrongSelf(shop)? ;? ? ??
NSLog(@"%@",shop.string);? ?
};? ?
shop.myBlock();
這2個(gè)打印結(jié)果都是shop.string有值并且shop也銷毀了, 看起來(lái)是沒(méi)什么區(qū)別:
Log.png
僅僅使用LRWeakSelf(shop);并且在myBlock中增加一個(gè)延遲3秒在輸出就會(huì)出現(xiàn)問(wèn)題, 雖然對(duì)象銷毀了, 輸出的值卻是null
//弱引用
LRWeakSelf(shop);?
shop.myBlock = ^{? ? ? ?
????dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0* ????NSEC_PER_SEC)), dispatch_get_main_queue(), ^{? ? ? ? ? ? ????????NSLog(@"%@",weakshop.string);? ? ? ?
????});?
};? ?
shop.myBlock();
Log.png
如果LRWeakSelf(shop);與LRStrongSelf(shop);一起使用輸出的shop.string有值,對(duì)象也銷毀了, 我就不再截圖給大家看了!
//弱引用
LRWeakSelf(shop);
????shop.myBlock = ^{
//強(qiáng)引用
LRStrongSelf(shop)? ?;? ?
????dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{? ? ? ? ? ? NSLog(@"%@",shop.string);? ? ?
? });? ?
};? ?
shop.myBlock();
通過(guò)上面一堆的解釋, 我們明顯發(fā)現(xiàn)LRWeakSelf(shop);與LRStrongSelf(shop);一起使用的好處, 不但能打印出我想要的值,而且也不會(huì)造成循環(huán)引用 , 在開(kāi)發(fā)中這兩個(gè)方法可以根據(jù)實(shí)際情況進(jìn)行使用!