1. 程式人生 > >block的迴圈引用的問題

block的迴圈引用的問題

在我們的編寫程式碼的時候,常常會出現一些迴圈引用的問題,今天就說說block的迴圈引用,引起的物件無法被釋放的問題

先說一下我們驗證問題的方法:

    -1.Navigationcontroller巢狀vc1;
    -2.由vc來push vc2;

    當vc2 pop控制器的時候會釋放vc2物件

下面是vc2中主要程式碼:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, copy) void(^block)();

@end

@implementation
ViewController
- (void)viewDidLoad { [super viewDidLoad]; // 定義一個block void (^task)() = ^{ NSLog(@"%@",self); }; // 賦值 self.block = task; // 執行block self.block(); } // 檢視物件是否銷燬 - (void)dealloc{ NSLog(@"ViewController再見"); }

這個時候pop,vc的dealloc方法不會被呼叫,因為在block中,獲取了self自身,而block是self建立的一個屬性,造成了迴圈引用的技術問題

這時,我們的解決方法就是:
建立一個弱指標,指向self,然後在block中呼叫這個若指標
這樣做的目的是,在block中不要有強指標指向self,用一個弱指標來代替self,可以獲取到self的同時,也不影響self的生死

有3中方法建立需要的弱指標:

    // 方式01
__weak typeof(self) weakSelf = self;
    // 方式02
__weak ViewController *weakSelf = self;
    // 方式03 (這種方式已經不再使用了 而且快速訪問和返回 會導致野指標訪問)
__unsafe_unretained  typeof(self
) weakSelf = self;

同理,在block中引用self的成員變數也會造成迴圈引用問題,解決方法同上.