Block的整理
使用Block在两个界面之间传值
1. 在 B 控制器的.h文件中定义声明Block属性
typedef void (^MyBlock)(NSString *);
@interface BViewControl: UIViewController
@property (nonatomic, copy) MyBlock returnBlock;
@end
第一行代码是为要声明的Block重新定义了一个名字 MyBlock
这样,下面在使用的时候就会很方便。
第三行是定义的一个Block属性
2. B控制器.m文件中
- (void)viewWillDisappear:(BOOL)animated {
if (self.MyBlock ) {
self.MyBlock(self.inputTF.text);
}
}
self.inputTF.text 是回传的字符串
3.在A控制器.m文件中
如下方法中书写:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
BViewControl *VC = segue.destinationViewController;
VC.returnBlock = ^(NString* string){
self.textLabel.text = string;
}];
}
可以看到代码中的注释,系统告诉我们可以用[segue destinationViewController]来获得B视图控制器。
4.BLock访问局部变量
{
int A = 8;
int (^Block)(int) = ^(int a){ return A + a;}; //block里面可以读取同一类型的outA的值
A = 5; //在调用Ptr之前改变A的值
int result = Block(3); // result的值仍然是11,并不是8
NSLog(@"result=%d", result);
为什么result 的值仍然是11?而不是8呢?事实上,myPtr在其主体中用到的outA这个变量值的时候做了一个copy的动作,把outA的值copy下来。所以,之后outA即使换成了新的值,对于myPtr里面copy的值是没有影响的。
需要注意的是,这里copy的值是变量的值,如果它是一个记忆体的位置(地址),换句话说,就是这个变量是个指针的话,
注意:
1.在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable
2.直接存取static类型的变量
3.那么在block里面就可以任意修改此变量的值
3.把Block 当成参数传递给一个函数
//function的定义,将Block作为参数
-void myFunction:(int (^mySquare)(int))myFunction;
//定义一个myBlock的Block 变量
int (^myBlock)(int) = ^(int a){
return a*a;
};
myFunction(myBlock); //把mySquare作为myFunction的参数