Block的整理

作者: 像小强一样活着 | 来源:发表于2016-02-24 14:52 被阅读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的参数

    相关文章

      网友评论

      • 煜寒了:代码可以用格式编辑一下
        煜寒了:看下简书关于markdown的语法,很简单的:smile:
        像小强一样活着:@煜寒了 都是在简书上直接写的 也是刚用这个 怎么编辑呢?

      本文标题:Block的整理

      本文链接:https://www.haomeiwen.com/subject/mplikttx.html