OC__block用法

来源:互联网 发布:windows系统漏洞 编辑:程序博客网 时间:2024/06/01 17:17
////  main.m//  Block////  Created by student on 16/1/13.//  Copyright © 2016年 niit. All rights reserved.//#import <Foundation/Foundation.h>int gNumber = 100;typedef void (^MyBlockType2)(int);//函数,一个参数是int型,另一个是block类型void repeat(int n,MyBlockType2 aBlock){    for (int i=0; i<n; i++) {        aBlock(i);    }    }int main(int argc, const char * argv[]) {    @autoreleasepool {/*        关于block        block值 一段代码        block变量 存放代码块的变量         ^ block的语法标记        block和函数很类似        1)一段代码,实现一段功能        2)有参数,返回值,调用方式一样*/#pragma mark 第一个block例子        //        int mutiplier = 7;        int (^foo)(int);        //定义一个block变量        //类型 int (^)(int)        foo = ^(int num){            return num*mutiplier;        };        //执行block//        NSLog(@"%i",foo(3));        #pragma mark 如何定义使用block        //格式:        //返回值(^block变量名)(参数列表) = ^(参数列表){具体代码};#pragma mark 最简单的block(无参数,无返回值)        //(无参数,无返回值)的block值        /*        ^()        {            NSLog(@"hello world!");        };                //一个block的变量(无参数,无返回值)的block变量        void(^aBlock)(void);        aBlock = ^(){            NSLog(@"hello world");        };                //执行调用block        aBlock();         */#pragma mark 2带参数带返回值的block  /*        void(^bBlock)(int);        void(^cBlock)(int,int);        int (^dBlock)(int,int);                bBlock = ^(int num){            NSLog(@"传入的值是%i,平方=%i",num,num*num);        };                cBlock = ^(int num1,int num2){            NSLog(@"%i + %i =%i",num1,num2,num1+num2);        };                dBlock = ^(int num1,int num2)        {            return num1+num2;        };                bBlock(10);        cBlock(20,30);        int result = dBlock(40,50);        NSLog(@"%i+%i=%i",40,50,result);     */#pragma mark block中使用全局变量和局部变量        void(^eBlock)(void) = ^(){            gNumber++;            NSLog(@"gNumber=%i",gNumber);        };        eBlock();        NSLog(@"gNumber=%i",gNumber);#pragma mark block局部变量//        int localNumber = 500; //block外的局部变量,可以访问,但是不能修改//        //        void(^fBlock)(void) = ^(){////            localNumber++; //会报错//            NSLog(@"localNumber = %i",localNumber);//        };//        fBlock();        __block int localNumber = 500; //加上__block关键字,block中可以修改局部变量        void(^fBlock)(void) = ^(){        localNumber++;            NSLog(@"localNumber = %i",localNumber);        };        fBlock();#pragma mark 用typedef给block起别名                int(^gBlock)(int,int);//gBlock是block变量        gBlock = ^(int n1,int n2){            return n1-n2;        };        typedef int (^MyBlockType)(int,int);//int (^)(int,int) =>MyBlockType        MyBlockType hBlock;//用别名定义hBlock变量        hBlock = ^(int n1,int n2){            return n1*n2;        };        #pragma mark block作为函数、方法的参数及返回值                MyBlockType2 iBlock = ^(int n){            NSLog(@"%i",n*n);        };        repeat(10, iBlock);        #pragma mark 练习        // 1 定义一个block变量并赋值,功能是打印100个*        void(^printBlock)() = ^(){            for (int i=0; i<10; i++) {                NSLog(@"**********");            }        };        printBlock();        // 2 定义一个block求1+2+3+...+n        int(^plusBlock)(int) = ^(int n){            int result=0;            for (int i = n; i>0; i--) {                result = result+i;            }            return result;        };        NSLog(@"%i",plusBlock(5));                // 3 定义一个block求平方        int(^pfBlock)(int) = ^(int n){            return n*n;        };        NSLog(@"%i",pfBlock(5));        // 4 定义一个block求三个书中最小值        int(^minBlock)(int,int,int) = ^(int a,int b,int c){            if (a<b&&a<c) {                return a;            }            else if (b<c){                return b;            }            else{                return c;            }        };        NSLog(@"%i,%i,%i中最小数是%i",12,25,24,minBlock(12,25,24));#pragma mark block应用        //遍历字典和数组                            }    return 0;}

#pragma mark block应用        //遍历字典和数组        NSDictionary *aDict = @{@"1001":@"张三",                                @"1002":@"李四",                                @"1003":@"王五",                                @"1004":@"赵六",                                };        NSArray *arr = @[@"小明",@"小王",@"小红"];                [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {            //遍历代码            NSLog(@"%@ 下标%i",obj,idx);            if ([obj isEqualToString:@"小王"]) {                *stop = YES;//遇到小王,停止遍历            }        }];                [aDict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {            NSLog(@"%@,%@",key,obj);        }];



0 0
原创粉丝点击