美文网首页
Block详解

Block详解

作者: Mr_董 | 来源:发表于2016-04-25 10:42 被阅读97次

一、block的基本

用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在 {}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):

block概念.png
  • block最简单形式
    定义格式:void (^block名)() = ^{代码块;}
    使用格式:block名();
    /*定义时,把block当成数据类型
    特点:1. 类型比函数定义多了一个 ^2. 设置数值,有一个 ^,内容是 {} 括起的一段代码
    最简单的定义方式
    void (^myBlock)() = ^ { // 代码实现; }
    /
    void (^myBlock)() = ^ {
    NSLog(@"hello");};
    // 执行时,把block当成函数
    myBlock();
        //1) 无参无返回值的block
        //格式:
        //   -定义block变量
        //   返回值类型  (^block变量名)(形参类型列表);
        
        //   -定义block变量并且赋值
        //   返回值类型 (^block变量名)(形参列表)=^(形参列表){  //代码块 };
        
        //  形式1: void (^block变量名)() = ^(){};
        //  形式2: void (^block变量名)() = ^{};  //省略了小括号
        
    - 例1
        1)无参无返回值的block
        void (^sbblock)();  //定义变量
        void (^sb1)()=^(){
            NSLog(@"哈哈,我来了!");
        };
        
        void (^sb2)()=^{
            NSLog(@"哈哈,我又又有来了来了");
        };
        
        // 执行block
        //格式: block变量名(实参);
//        sbblock();  //如果只定义,就使用,会报错,因为sbblock没有初始化
        sb1();
        sb2();
        
        
        2)有参数无返回值的block
         形参列表的格式:  数据类型 变量名
        void (^myblock1)(int a);   // 定义一个无返回值有一个参数的block变量,变量名为myblock1
        
        myblock1 = ^(int a){

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

        }; //分号结束
        
        myblock1(438);
        
        //3)有参数\有返回值的block的使用
        // int sum(int a,int b){  return a+b; }
        
        int (^myblock2)(int a,int b)=^(int a,int b){
        
            return a+b;
        };
        
        //执行block并且接收block执行的结果
        int sum = myblock2(20,34);  //返回值
        NSLog(@"sum = %d",sum);

2.block的typedef

  • typedef int INT; int 起个别名 INT

  • typedef int ARR[4]; ARR a1; //定义了一个长度为4的整形数组

  • 格式:typedef 返回值类型 (^新别名)(参数类型列表);
    Typedef int(^MyBlock)(int ,int);

    例1)
    //给无参无返回值block变量起别名;
    //格式: void (^新类型名)();

typedef void (^newType)();
//用新的类型定义block变量
newType t1;
t1 = ^{
NSLog(@"我是使用newType定义出来的变量t1的值");
};
//使用block
t1();

3.block访问外部变量

在block内部可以使用外部变量,但是注意,这是一个新的内存空间变量,以const拷贝的方式

block访问外部.png

这样,block可以访问外部变量,但是不可以修改

  • 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。这样是直接给变量做了一个从栈区拷贝到堆区的变量,使用的是堆区的变量
//使用__weak两种
__weak typeof(TWPhotoCollectionViewCell *) weakCell = cell;
__weak HEIMController *selfWeak = self;

相关文章

  • iOS Block实例

    iOS之Block详解:Block详解 ViewController.h(ARC) ViewController....

  • Block - block简单的使用

    参考文档 iOS Block详解 一、忘记block格式? 样例一.png 样例二.png 二、Block的定义 ...

  • SDWebImage4.0源码探究(二)具体代码拓展

    代码一 知识点:block参考:iOS中block的详解weakSelf、strongSelf <转自唐巧>Blo...

  • 关于block的理解

    block的类型详解 关于block的知识,在网络上的资料那是相当的多。不过这里还是想来谈谈自己对block的理解...

  • iOS 题目详解 部分三

    主要讲解Block 内部使用strongSelf的理由和用法 iOS 题目详解 部分一iOS 题目详解 部分二...

  • Block详解

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

  • Block详解

    1️⃣Block的修饰 ARC情况下( ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Ref...

  • block详解

    __weak typeof(self) weakSelf = self;self.handler = ^{type...

  • Block详解

    __block说明符 Block只能保存局部变量瞬间的值,所以当我们尝试修改截获的自动变量值,就会报错。例如: 该...

  • Block详解

    block的定义,调用等就不介绍了,自行去查资料。 本文介绍内容: 1.block的底层数据结构2.block的类...

网友评论

      本文标题:Block详解

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