以前学习block的时候总是听说block有捕获性,一直也没弄明白究竟是个什么。静下心来研究,写了一个小Demo,有了一点小结论,记录下来方便自己复习。
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 <UIKit/UIKit.h>
@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的代码来说捕获性,为了看起来方便我直接截图了代码,不用移到上边去看。
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。
都是我自己的见解,广大读者若发现错误请留言指正,谢谢,希望大家都能够在这条路上越走越远。
网友评论