Objective-C中block的捕获性

以前学习block的时候总是听说block有捕获性,一直也没弄明白究竟是个什么。静下心来研究,写了一个小Demo,有了一点小结论,记录下来方便自己复习。

Objective-C中block的捕获性_第1张图片
block作为属性写在NewViewController中

我现在用到的block仅限于此,作为属性使用。下面开始说正题,block的捕获性。

ViewController.m

NewViewController *new = [[NewViewController alloc]init];
CGFloat ipx = 0;
new.fuckBlock = ^{
    NSLog(@"输出结果%f",ipx);
    NSLog(@"是否循环引用%@",self);
};
ipx = 50;
NSLog(@"block外输出:%f",ipx);
[self.navigationController pushViewController:new animated:YES];

NewViewController.h

#import 

@interface NewViewController : UIViewController
@property(copy,nonatomic)void (^fuckBlock)(void);
@end

NewViewController.m

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    self.fuckBlock();
}

控制台输出结果


print结果.png

结合ViewController.m的代码来说捕获性,为了看起来方便我直接截图了代码,不用移到上边去看。


Objective-C中block的捕获性_第2张图片
block.png

这里定义了一个CGFloat类型的变量ipx,ipx = 0;
37,38行是运行不到的,需要在NewViewController中返回到ViewController中才会执行这两句代码;

40行ipx重新赋值为50,并于41行输出结果为50;
42行push到NewViewController中,然后操作模拟器pop回到ViewController中执行37,38行代码。此时的ipx作为局部变量应该已经被销毁了,因为fuckAction这个方法已经结束,但是因为block的捕获性仍然能够输出ipx。

都是我自己的见解,广大读者若发现错误请留言指正,谢谢,希望大家都能够在这条路上越走越远。

你可能感兴趣的:(Objective-C中block的捕获性)