1. 程式人生 > >block解決迴圈引用(二)

block解決迴圈引用(二)

接著上一遍,這裡首先講一下
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