我的天空iOS进阶指南程序员

Block的整理

2016-02-24  本文已影响239人  像小强一样活着

使用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的参数

上一篇下一篇

猜你喜欢

热点阅读