iOS学习笔记-----Block初探

Block概要

1.block是一个匿名函数代码块

   (1)block声明的时候,就是传值的时候,代码块并没有被运行.
   (2)在block回调的时候代码块才被执行.

Block语法

1.Block语法

‘^’托字符 返回值类型(可省略) (参数列表) {表达式}

//1.无参数无返回值的block
   ^(void){ NSLog(@"--------**^((");}
//2.有参数有返回值的block
   ^(int a){ return a+1;}

2.Block类型变量

//1.无参数无返回值的block
    void (^myBLock1)(void);
        //对Blcok类型变量的赋值
        myBLock1 = ^(void){

            NSLog(@"--------**^((");
        };

        // block回调
        myBLock1();

 //2.有参数有返回值的block

     int (^sumBlock)(int, int) = ^(int a, int b){

            return  a + b;
        };

        NSLog(@"%d", sumBlock(10, 20));

3.block类型重命名

使用typedef对block类型进行重命名(参数类型和返回值类型,以及有无参数,有无返回值,都会造成block类型)

   typedef int (^MathBlock)(int, int);
   MathBlock sumBlock;
   sumBlcok = ^(int a,int b){return a +b ;};

4.__block关键字

block里的代码块修改block外面的变量,需要加上关键字__block,这个值在外面访问也是访问到已经被改变的值

int main(int argc, const char * argv[]) {
    @autoreleasepool {


        typedef float (^MyBlock) (float, float);
        MyBlock multiBlock;
        // block外面定义变量
        __block int c = 10;
        multiBlock = ^(float a, float b){

            c--;
            NSLog(@"c = %d", c);
            return a * b;
        };

        NSLog(@"c = %d", c);

        float result = multiBlock(2.5, 3.0);
        NSLog(@"result = %f", result);

        NSLog(@"c = %d", c);
        /*打印结果为:c = 10
                    c = 9
                    c = 9
        */

Blocjk简单用法

1.block遍历数组与字典

        // block遍历数组
        NSArray *array = @[@"hello", @"world", @"!!!"];
        [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

            if(idx == 1) {

                *stop = YES;
            }

            NSLog(@"%lu   %@", idx, obj);
        }];

        // block遍历字典
        NSDictionary *dic = @{
                              @"key" : @"value",
                              @"name" : @"salary",
                              @"menpai" : @"wudan"
                              };

        [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

            NSLog(@"key:%@ value:%@", key, obj);

        }];


    }
    return 0;
}

2.block实现对象间通讯

事件:小孩变脏,需要保姆照顾

 回顾代理设计模式:
 (1)产生事件的对象:小孩
 (2)响应事件的对象:保姆
 (3)保姆签协议:实现方法
 (4)小孩要设置代理对象

 block实现对象间通信要点
 (1)产生事件的对象:一,要有block属性 二,谁产生事件谁回调block
 (2)响应事件的对象:谁响应事件谁传递block

关键代码:

(1)在产生事件的对象中定义Block属性

typedef void(^HandleChildBlock)(Child *);

@property(nonatomic, assign) NSInteger cleanValue;
// block的内存管理方式用copy
@property(nonatomic, copy) HandleChildBlock washBlock;

(2)在影响事件的对象中给Block赋值

- (void)washChild:(Child *)child {

    // 功能是把小孩的清洁值变为100

    child.washBlock = ^(Child *ch){

        NSLog(@"保姆给小孩洗白白");
        ch.cleanValue = 100;

    };

(3)在产生事件的对象中回调Block


  if(self.washBlock){

            _washBlock(self);
        }

你可能感兴趣的:(iOS学习笔记)