block解決迴圈引用(二)
阿新 • • 發佈:2019-01-07
接著上一遍,這裡首先講一下
block的反向傳值
ViewController和ViewController1
//ViewController1裡面
typedef void(^MyBlock)(NSString *str);
@interface ViewController1 : UIViewController
@property (nonatomic,copy) MyBlock myBlock;
ViewController裡面的程式碼
//1.不會迴圈引用
ViewController1 *vc = [[ViewController1 alloc]init];
vc.myBlock = ^(NSString *str) {
NSLog(@"%@",str);
NSLog(@"%@",self.str);
NSLog(@"%@",self.str = str);
};
[self.navigationController pushViewController:vc animated:YES];
//ViewController1 裡面進行反向傳值
if (self.myBlock) {
self.myBlock(@"20");
}
[self .navigationController popViewControllerAnimated:NO];
//2.會迴圈引用
ViewController1 *vc = [[ViewController1 alloc]init];
vc.myBlock = ^(NSString *str) {
NSLog(@"%@",vc.VC1Str);
NSLog(@"%@",vc);
};
[self.navigationController pushViewController:vc animated:YES ];
//3.解除迴圈引用
ViewController1 *vc = [[ViewController1 alloc]init];
__weak typeof(vc) weakSelf = vc;
vc.myBlock = ^(NSString *str) {
NSLog(@"%@",weakSelf.VC1Str);
NSLog(@"%@",weakSelf);
};
[self.navigationController pushViewController:vc animated:YES];
block作為引數使用
這種只能在方法內部進行呼叫,用於回撥和傳值等
//這裡聲明瞭一個Person,裡面有一個方法
typedef void (^Block) (NSString * str);
@interface Person : NSObject
-(void)testBlock:(Block)myBlock;
//在ViewController裡面倒入一下
@interface ViewController ()
@property (nonatomic,strong)Person *person;
[self.person testBlock:^(NSString *str) {
NSLog(@"%@",str);
NSLog(@"%@",self.str);
NSLog(@"%@",self.str = str);
NSLog(@"%@",self.person.personStr);
}];
//像這種block是在方法中 ,以上在block裡面的操作,都不會造成迴圈引用。這種block不屬於物件的屬性,並沒有被物件持有,也並不會引起迴圈引用。
//AFNetworking裡面也是這種操作,很多時候我們也會去這樣使用。
block的注意點
1.在block內部使用外部指標且會造成迴圈引用情況下,需要用到_weak修飾外部指標
__weak typeof(self) weakSelf = self;
2.在block內部如果呼叫了延時函式還使用了弱指標會取不到指標,因為已經被銷燬了,需要在block內部再將弱指標重新強引用一下。
__strong typeof(self) strongSelf = weakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[... test];
});
3.如果需要在block內部改變外部棧區變數的話,需要在用__block修飾外部變數
以上就是全部了,感覺有用的上個星,附上demo下載地址
如有疑問,歡迎跟我溝通,qq:2877025939