OC中block知识点使用方法

作者: woooooo | 来源:发表于2016-09-15 12:41 被阅读122次

block

作用

  • block用来保存一段代码
  • block标志 ^
  • 跟函数很像
    • 1.可以保存代码
    • 2.有返回值
    • 3.有形参
    • 4.调用方式一样
  • 无返回值无参数
    //定义block变量
    void (^myblock)() = ^ {
      //没有形参可以省略后面的()
        NSLog(@"----");
    };
    
     //利用block调用block内部的代码
    myblock();
  • 有返回值有参数
    int (^sumblock)(int, int) = ^(int a, int b) {
        return a + b;
    };
    
    int c = sumblock(10,11);
    
    NSLog(@"%d",c);
    

block的重定义

  • 我们先看一段关于typedef重定义函数指针的
定义一个两数之和的函数
int sum(int a, int b) {
    return a + b;
}

定义两个函数指针指向sum
    int (*p1)(int, int) = sum;
    int (*p2)(int, int) = sum;
    
因为代码过多重复我们可以typedef重定义一个函数指针类型

typedef int (*SumP)(int, int);   
//ps:重定义函数指针 (*SumP)中SumP就是类型名

以后我们就可以这样定义两个函数指针

    SumP p3 = sum;
    
    SumP P4 = sum;

block访问外面的变量

block内部可以访问外部变量

    int a = 5;
    
    void (^blockA)() = ^() {
        
        NSLog(@"%d",a);
    };
    
    blockA();

打印结果为

2016-09-15 14:01:18.552 block[590:22729] 5

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

  • 如下这样写会报错
    
    int a = 5;
    
    void (^blockA)() = ^() {
        
        a = 3;
    };
    
  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改(如下这样不会报错)
    
    __block int a = 5;
    //变量前加上__block修饰符
    void (^blockA)() = ^() {
        
        a = 3;
    };
    
    blockA();

typedef重定义block类型

  • typedef重定义block类型和函数指针很像
 typede int (^MyBlock)(int, 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(25,12);
    
    NSLog(@"%d",minus);
 
 //使用MyBlock类型连续定义变量 
   MyBlock a, b; 

总结

1>.如何定义block变量

int (^sumBlock)(int, int);
 void (^myBloc)();

2> 如何利用block封装代码

^(int a, int b) {
 return a - b;
 }
 
 ^() {
 NSLog(@"--------");
 }
 
 ^ {
  NSLog(@"--------");
 //参数为空时()可以省略
 }

3> block访问外部变量

  • block内部可以访问外部变量
  • 默认情况下block内部不能修改外面的局部变量
  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改 原因--(将OC代码反编译C++可以看到)block与外部变量默认是值传递,当加上__block修饰之后就会修改成地址传递,这样就可以修改外部变量了

4>利用typeddef定义block类型



typedef int (^MyBlock)(int, 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;
 };

相关文章

  • OC中block知识点使用方法

    block 作用 block用来保存一段代码 block标志 ^ 跟函数很像 1.可以保存代码 2.有返回值 3....

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • Block详解

    1.Block定义及使用 首先看下Block的定义和使用。 实际使用方法 Block看起来比较复杂,在OC中实际上...

  • oc与swift混用编程,以及block,闭包的使用方法

    ##oc与swift混用编程,以及block,闭包的使用方法 @interfaceViewController :...

  • iOS原生&JS交互

    OC 获取js中的key OC调用js方法 JS调用OC中不带参数的block JS调用OC中带参数的block ...

  • Swift之闭包

    前言 闭包类似于OC的block,但是比OC的block应用面更广 在OC中block是匿名函数 在swift中函...

  • Swift 之闭包

    闭包 闭包类似于 OC 的 block,但是比 OC 的 block 应用面更广 在 OC 中 block 是匿名...

  • iOS Block本质笔记

    OC中定义block block访问外部参数 OC转C++分析 block的变量捕获机制 为了保证block能够正...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • swift 闭包(类似OC中block)

    swift中的闭包 类似OC中block OC中block 回顾创建个HttpTool类.h .m 控制器中 sw...

网友评论

    本文标题:OC中block知识点使用方法

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