在Block中使用weakSelf与strongSelf的意义
生活随笔
收集整理的這篇文章主要介紹了
在Block中使用weakSelf与strongSelf的意义
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Block中使用weakSelf與strongSelf的意義
我們都會聲明一個弱引用在block中使用, 目的就是防止循環引用, ?那么weakSelf與strongSelf一起使用目的是什么呢? 首先先定義2個宏:
#define YXWeakSelf(type) __weak typeof(type) weak##type = type; #define StrongSelf(type) __strong typeof(type) type = weak##type;
在Controller中YXWeakSelf(self)與YXStrongSelf(self)一起使用情況很多,為了防止循環引用,還是不懂原因的見如下實例:
我們創建一個shop并且在shop.myBlock代碼塊中使用弱引用YXWeakSelf(shop)
? ?LRShop *shop = [[LRShop alloc]init];shop.string = @"welcome to our company";//弱引用YXWeakSelf(shop)shop.myBlock = ^{NSLog(@"%@",weakshop.string);};shop.myBlock();
YXWeakSelf(shop)與YXStrongSelf(shop)一起使用
LRShop *shop = [[LRShop alloc]init];shop.string = @"welcome to our company";//弱引用YXWeakSelf(shop);shop.myBlock = ^{//強引用YXStrongSelf(shop)NSLog(@"%@",shop.string);};shop.myBlock();
這2個打印結果都是shop.string有值并且shop也銷毀了, 看起來是沒什么區別:
僅僅使用YXWeakSelf(shop)并且在myBlock中增加一個延遲3秒在輸出就會出現問題, 雖然對象銷毀了, 輸出的值卻是null
//弱引用YXWeakSelf(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();
如果YXWeakSelf(shop)與YXStrongSelf(shop)一起使用輸出的shop.string有值,對象也銷毀了, 我就不再截圖給大家看了!
//弱引用YXWeakSelf(shop)shop.myBlock = ^{//強引用YXStrongSelf(shop)dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSLog(@"%@",shop.string);});};shop.myBlock();
通過上面一堆的解釋, 我們明顯發現YXWeakSelf(shop)與YXStrongSelf(shop)一起使用的好處, 不但能打印出我想要的值,而且也不會造成循環引用 , 在開發中這兩個方法可以根據實際情況進行使用!
總結
以上是生活随笔為你收集整理的在Block中使用weakSelf与strongSelf的意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: navigationController
- 下一篇: 关于Xcode 7.3 7.3.1 断点