如何利用block封装代码,block 就相当于是

作者: 编程  发布:2019-09-11

四、利用typedef定义block类型

 typedef int ; myBlock block = ^(int a, int b) { return a   b; };

拆开写:

typedef int ; myBlock block; block = ^(int a, int b) { return a   b; }; 

默认情况下block内部不能修改外面的局部变量

带参数和返回值的block

int sum(int a, int b)
{
    return a   b;
}

int main()
{
    //指向函数的指针
    int (*p)(int,int) = sum;
    int d = p(10,12);
    NSLog(@"%d",d);

   //OC中不常用指向函数的指针,一般用block代替
    int (^sumblock)(int, int) = ^(int a, int b) {
        return a   b;
    };

    int c = sumblock(11, 11);
    NSLog(@"%d",c);

    //用block输出n条直线
    void (^lineblock)(int) = ^(int n)
    {
        for (int i = 0; i < n; i  ) {
            NSLog(@"------");
        }
    };
    myblock2(5);
    return 0;
}

变量访问

  • 在block中可以使用和改变全局变量
  • block内部可以访问外面的变量
  • 局部变量,可以使用,不能改变
    本地变量,代码块会在定义的时候复制并保存他们的状态,作为常量获取到
typedef double (^MulBlock)(void);
double a=10,b=20;
MulBlock b=^(void){
    return a*b;
}
a=20;
b=50;
NSLog(@“%f”,b(a, b));//此时还是会输出200

*可以通过将变量标记为全局(static)解决

  • 默认情况下,block内部不能修改外面的局部变量
  • 给局部变量加上_blcok关键字,这个局部变量就可以在block内部修改
_block int b=20;

相信大家都明白 block 的重要性是毋庸置疑的,它本身封装了一段代码并将这段代码当做变量,通过 block() 的方式进行回调。block的这种机制和 函数指针 非常像。而我的理解即是: block 就相当于是 有返回类型代码块

基本用法

  • 作用
    block用来保存一段代码
  • block的标志: ^
  • block与函数
    • block与函数很像
      1.可以保存代码
      2.有返回值
      3.有形参
      4.调用方式一样
  • Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境

基本语法

block用来保存一段代码
block的标志:^

  1. 没有返回值和形参时,可以省略后面的()
void (^myBlock) ()= ^ {
    //要保存的代码段
};

// 调用方式与函数一样:
myBlock();
  1. 有返回值
int (^sumBlock) (int , int) = ^(int a , int b){
    return a b;
};
int c = sumBlock(10,12);

对比函数指针:

int sum(int a, int b){
    return a b;
}

//调用:
int (*p)(int, int)=sum;
int d = p(10,12);
  • 再来一个例子:
void (^lineBlock)(int) = ^(int n){
      for(int i=0; i<n; i  ){
        NSLog(@“_______”);
      }
};
lineBlock(5);
  1. 使用typedef定义block类型
    //定义MyBlock是一个传两个int类型的参数,返回一个int的代码块
typedef  int (^MyBlock)(int, int);

这时
int (^sumBlock) (int , int) = ^(int a , int b){
9159.com ,return a b;
};
int c = sumBlock(10,12);
就可以写成:

MyBlock sumBlock=^(int a, int b){
    return a b;
};
sumBlock(1, 2);

二、调用block

int c = sumBlock;
2016-09-15 14:01:18.552 block[590:22729] 5

定义属性block

@property (nonatomic, copy) void (^completionClock)();

一、定义block

返回类型 (^block类型名称)

void { NSLog(@"---这是一个block---");};int (^sumBlock) = ^(int a, int b) { return a   b;};就等同于: int a = 10;的形式拆开写:void ();block = ^{ NSLog(@"---这也是一个block---");};对比函数:int sum(int a, int b){ return a   b;}

定义block变量

/**
如果block没有形参,可以省略后面的()
*/
void (^myBlock)() = ^{
     NSLog(@"------");
     NSLog(@"--------");
 };
 myBlock();

三、block访问外部变量

  • block内部可以访问外面的变量

     int a = 10; void (); block = ^{ NSLog(@"a=%d",a); };
    
  • 默认情况下,block内部不能修改外面的局部变量

     int a = 10; void (); block = ^{ a = 20; }; //这是错误的
    
  • 给局部变量加上__block关键字,这个局部变量就可以在block内部修改

     __block int a = 10; void (); block = ^{ a = 20; };
    

打印结果为

block使用总结

1>如何定义block变量
int (^sumBlock)(int,int); void (^myBlock)();
2>如何利用block封装代码

^(int a, int b) {
    return a - b;
};
^() {
    NSLog(@"----");
};
^ {
    NSLog(@"-----");
};
  • block访问外部变量

    • block内部可以访问外面的变量
    • 默认情况下,block内部不能修改外面的局部变量
    • 给局部变量加上__block关键字,这个局部变量可以在block内部修改
  • 利用typedef定义block类型
    typedef int (^MyBlock)(int, int);
    以后就可以利用MyBlock这种类型来定义block变量

MyBlock block;
MyBlock b1,b2;
b1 = ^(int a, int b) {
    return a   b;
};
MyBlock b3 = ^(int a, int b){
    return a   b;
};
  • 我们先看一段关于typedef重定义函数指针的

1>.如何定义block变量

block内部可以访问外部变量

typedef int ;MyBlock block; //定义一个MyBlock 类型的变量 MyBlock block1, block2; //连续定义两个MyBlock 类型的变量 block1 = ^(int a, int b) { return a - b; }; MyBlock block3 = ^(int a, int b) { return a   b; };
  • 有返回值有参数

3> block访问外部变量

  • typedef重定义block类型和函数指针很像
 //定义block变量 void () = ^ { //没有形参可以省略后面的() NSLog; }; //利用block调用block内部的代码 myblock();

4>利用typeddef定义block类型

  • 如下这样写会报错

2> 如何利用block封装代码

  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改
int (^sumBlock); void ();
 int (^sumblock) = ^(int a, int b) { return a   b; }; int c = sumblock; NSLog; 
  • block用来保存一段代码
  • block标志 ^
  • 跟函数很像
    • 1.可以保存代码
    • 2.有返回值
    • 3.有形参
    • 4.调用方式一样
  • 无返回值无参数

定义一个两数之和的函数int sum(int a, int b) { return a   b;}定义两个函数指针指向sum int  = sum; int  = sum; 因为代码过多重复我们可以typedef重定义一个函数指针类型typedef int ; //ps:重定义函数指针 中SumP就是类型名以后我们就可以这样定义两个函数指针 SumP p3 = sum; SumP P4 = sum;
 int a = 5; void  { a = 3; }; 
 __block int a = 5; //变量前加上__block修饰符 void  { a = 3; }; blockA();
  • block内部可以访问外部变量
  • 默认情况下block内部不能修改外面的局部变量
  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改 原因--(将OC代码反编译C 可以看到)block与外部变量默认是值传递,当加上__block修饰之后就会修改成地址传递,这样就可以修改外部变量了
^(int a, int b) { return a - b; } ^() { NSLog(@"--------"); } ^ { NSLog(@"--------"); //参数为空时()可以省略 }
 int a = 5; void  { NSLog; }; blockA();
 typede int ; MyBlock 是类型名 MyBlock sumBlock; //定义一个MyBlock类型的变量 sumBlock = ^(int a, int b) { return a   b; };//给block变量赋值保存的代码我们定义一个减法类型的 MyBlock minusBlock = ^(int a, int b) { return a - b; }; int minus = minusBlock; NSLog(@"%d",minus); //使用MyBlock类型连续定义变量 MyBlock a, b; 

本文由9159.com发布于编程,转载请注明出处:如何利用block封装代码,block 就相当于是

关键词: 9159.com

上一篇:两字母前缀9159.com,少用与之等价的方法
下一篇:没有了