Block用法解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Block代码块是对C做出的一个补充,初次体验代码块,无比的不适应。古怪的语法确实让人不易入门甚至精通。但若能够深入精通Block的使用,会给代码带来层次上的提升。Block就是一段在将来被执行的代码定义块语法 ^[块返回值类型](形参类型1 形参1,形参类型2 形参2,.

Block代码块是对C做出的一个补充,初次体验代码块,无比的不适应。古怪的语法确实让人不易入门甚至精通。但若能够深入精通Block的使用,会给代码带来层次上的提升。Block就是一段在将来被执行的代码

定义块语法

    ^[块返回值类型](形参类型1 形参1,形参类型2  形参2,...)
    {
    //块执行任务
    }

需要注意的是定义块必须以^开头

定义块变量

块返回值类型  (^块变量名)(形参类型1,形参类型2,...);

简单实例

     //定义块变量
    void(^NSLogStr)();
   //通过块变量调用块
    NSLogStr=^(void)
    {
    };
     //定义无返回值不带参数
   void (^NSLogStr)()=^()
    {
        //代码块实现的方法
        NSLog(@"Hello Block");
    };
    //通过代码变量调用代码块
    NSLogStr();

局部变量

  1. 在默认状态,当用块访问局部变量的值时候,是不允许修改局部变量的。

这里写图片描述

但当为局部变量加上 __block修饰就可以修改局部变量

 __block int a=10;

   void (^NSLogStr)()=^()
    {
        //读取局部变量a,是可以的
        NSLog(@"%d",a);
        //试图修改局部变量,错误的。无法运行通过
        a=20;
        NSLog(@"%d",a);

        NSLog(@"Hello Block");
    };
    //通过代码变量调用代码块
    NSLogStr();
2016-05-01 16:20:23.860 [2470:103092] 10
2016-05-01 16:20:23.861 [2470:103092] 20
2016-05-01 16:20:23.861 [2470:103092] Hello Block
  1. 看下面代码
    int a=10;

   void (^NSLogStr)()=^()
    {
        //读取局部变量a,是可以的
        NSLog(@"%d",a);
        NSLog(@"Hello Block");
    };
    a=30;
    //通过代码变量调用代码块
    NSLogStr();
      NSLog(@"%d",a);

猜猜应该打印的值是多少?两个a都是30?

2016-05-01 16:27:57.600 [2543:107259] 10
2016-05-01 16:27:57.601 [2543:107259] Hello Block
2016-05-01 16:27:57.601 [2543:107259] 30

Why?

原来,在定义代码块时就已经把局部变量的值复制到块 。所以即使在定义后、调用前修改局部变量,依然是没有用的。 倘若我们我们想等到执行时才去访问获取甚至去修改局部变量的值,我们可以在局部变量前面加__block

Block高级用法

代码块作为函数的参数(只能当函数的最后一个参数)

这时候我们需要引入一个typedef用typedef可以定义代码块类型,主要有两个作用

  • 复用块变量类型,使用块变量类型可以重复定义多个块变量

  • 使用块变量类型定义函数参数,这样可定义带块参数的函数

    typedef 块返回值类型(^块变量类型)(形参类型1,形参类型2,....);
    

定义一个函数,Block作为函数最后一个参数

typedef NSString* (^LogStr)(NSString *);

void NSLogStr(NSString *name,LogStr log)
{
    NSLog(@"%@%@",log(name),@",欢迎您");
}
调用:
   NSString *name=@"乔布斯";
 NSLogStr(name, ^NSString *(NSString *name) {
     return name;
 });

代码块取代代理传值

相关文章
|
3月前
|
前端开发 JavaScript 安全
javascript:void(0);用法及常见问题解析
【6月更文挑战第3天】JavaScript 中的 `javascript:void(0)` 用于创建空操作或防止页面跳转。它常见于事件处理程序和超链接的 `href` 属性。然而,现代 web 开发推荐使用 `event.preventDefault()` 替代。使用 `javascript:void(0)` 可能涉及语法错误、微小的性能影响和XSS风险。考虑使用更安全的替代方案,如返回 false 或箭头函数。最佳实践是保持代码清晰、安全和高性能。
140 0
|
1月前
|
关系型数据库 TensorFlow 算法框架/工具
Docker技术概论(4):Docker CLI 基本用法解析
Docker技术概论(4):Docker CLI 基本用法解析
115 1
|
3月前
|
Java 开发者 Spring
深入解析这两种扩展机制的工作原理和用法
深入解析这两种扩展机制的工作原理和用法
|
1月前
|
数据采集 运维 监控
运维笔记:流编辑器sed命令用法解析
运维笔记:流编辑器sed命令用法解析
41 5
|
1月前
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
37 0
|
3月前
|
存储 SQL 算法
【源码解析】深入解析 pandas的Block 类中算术运算和重排实现
【源码解析】深入解析 pandas的Block 类中算术运算和重排实现
|
3月前
|
存储 SQL 数据挖掘
【源码解析】使用 Pandas 优化数据存储:深入解析 Block 合并机制
【源码解析】使用 Pandas 优化数据存储:深入解析 Block 合并机制
|
4月前
|
监控 Linux 数据处理
|
2月前
|
并行计算 Java 开发者
解析Java中的Lambda表达式用法
解析Java中的Lambda表达式用法
|
2月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析

推荐镜像

更多