zoukankan      html  css  js  c++  java
  • Block使用

      

    1、对block的理解

        >  block是iOS4.0之后出现的,是仿照java中匿名函数所创造的,它是c级别的语法,效率比协议-代理高

        >  block的是一个匿名函数(没有名字的函数)

        > 我们可以把block变量看做一个OC的变量,只是这个变量指向的是一个函数。

       // 我们可以为block变量赋值, 赋值一个匿名函数。

    2、对block的使用

       

    2.1 最简单的block

    //声明一个最简单的block,没有参数和返回值, ^ 是block的特殊符号

        void(^)()  _myFirstBlock;

    //赋值 (_myFirstBlock是一个block变量, 指向后面大括号所代表的无参的匿名函数)

    _myFirstBlock = ^{

            NSLog(@"my first block!");

        };

        //调用block,相当于调用赋给block的函数

        _myFirstBlock();

    2.2 带参数和返回值的block

        //声明一个带有两个参数的block,同时有一个返回值

        NSInteger (^_mySecondBlock)(NSInteger a, NSInteger b);

        //赋值

        _mySecondBlock = ^(NSInteger a, NSInteger b){

            NSLog(@"my second block!");

            return a + b;

        };

        //调用

        NSInteger sum = _mySecondBlock(35, 27);

        NSLog(@"sum:%d",sum);

    2.3 使用block实现两个页面的反向传值

           

    案例:有两个页面, 一个是视图控制器: QFViewController, 另一个是加在其上面的视图:QFView;

    说明:QFViewController 给 QFView 传值属于正向传值

      QFView 给 QFViewController 传值属于反向传值

    实现:从QFView到QFViewController的反向传值;

    方法一:通过属性赋值block的方式

    QFView.h中:

    #import <UIKit/UIKit.h>

    //创建一个 void(^)(NSString *returnString) 的别名 MyBlock

    typedef void(^)(NSString *string) MyBlock;

    @interface QFView : UIView

    //定义一个MyBlock变量block(相当于:void(^ block)(NSString *string))

    ( 还不懂?那就理解为MyBlock是一个匿名函数类,block是它的一个对象)

    @property (nonatomic, strong)MyBlock block;

    @end

    QFView.m中:

    //按钮点击或其他事件触发,需要反向传值,则调用block

    -(void)buttonClick:(UIButton *)button

    {

        //判断_block不为nil,则调用_block(@“”)反向传值

        if (_block) {

            _block(@"我把这个字符串返回");

        }

    }

    QFViewController.m中:

    //创建QFView对象

        QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];

        

        //给view中的block赋值一个函数,当view中调用block()时,也就调用了下面方法;

        view.block = ^(NSString *string) {

            NSLog(@"收到QFView传给我的字符串:%@", string);

        };

    方法二:通过方法赋值block的方式

    QFView.h中:

    #import <UIKit/UIKit.h>

    //创建一个 void(^)(NSString *returnString) 的别名 MyBlock

    typedef void(^MyBlock)(NSString *string);

    @interface QFView : UIView

    {

        MyBlock myBlock;

    }

    //通过方法参数传入block(如有需要还可以带其他参数)

    - (void)setText:(NSString *)text MyBlock:(MyBlock)block;

    @end

    QFView.m中:

    //通过方法传入block

    -(void)setText:(NSString *)text MyBlock:(MyBlock)block

    {

        //将外面传入的block 赋值给本类中的成员变量myBlock(可在其他方法中使用)

        myBlock = [block copy];

    }

    //按钮点击或其他事件触发,需要反向传值,则调用myBlock

    -(void)buttonClick:(UIButton *)button

    {

        //判断myBlock不为nil,则调用myBlock(@“”)反向传值

        if (myBlock) {

            myBlock(@"我把这个字符串返回");

        }

    }

    QFViewController.m中:

        //创建QFView对象

        QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];

        

        //通过view中的方法传入函数赋值给view中myBlock,当view中调用myBlock()时,也就调用了下面方法;

        [view setMyBlock:^(NSString *string) {

            NSLog(@"收到QFView传给我的字符串:%@", string);

        }];

  • 相关阅读:
    MySQL Server 5.0安装教程
    c++实现一个小算法
    spring core 与 context理解
    关于eclipse的mysql连接配置
    eclipse中创建一个maven项目
    Oracle中的多表查询(笛卡尔积原理)
    Vue进阶
    计算机网络基础
    java框架之springboot
    bootstrap学习
  • 原文地址:https://www.cnblogs.com/lijiehai/p/4398994.html
Copyright © 2011-2022 走看看