iOS开发中Block的理解与使用

  1. 简介

    • 我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息。
    • block是代码块,其本质和变量类似。不同的是代码块存储的数据是一个函数体。使用Block,就可以像其他标准函数一样,传入参数,并得到返回值。

      block的格式:

    a:Block的返回值类型,可以为空(void);

    b:Block对象名称,可以理解为变量名;

    ^:块的语法标记,声明b为一个Block对象;

    c:第一个参数类型

    d:第二个参数类型

    name1,name2:参数名;

    {}:Block代码块的主题部分。

    例:

    int (^myBlock)(int,int) = ^(int num1, int num2) {
            return num1 + num2;
        };
        NSLog(@"%d",myBlock(5,4)); 
      • 打印结果:9。
  2. 定义和使用
    1. 定义无返回值、无参数的Block

      • // 1.定义无返回值、无参的Block
            void (^block1)() = ^() {
                NSLog(@"无返回无参的Block");
            };
            block1();
    2. 定义无返回值、有参数Block
      • // 2.定义无返回值、有参数的Block
            void (^block2)(int) = ^(int a) {
                NSLog(@"%d",a);
            };
            block2(2);
    1. 定义返回值为OC对象的Block
      • // 3.定义返回值为OC对象的Block
            NSString *(^block3)(NSString *) = ^(NSString *string) {
                string = [NSString stringWithFormat:@"%@_%@",string,string];
                return string;
            };
            NSLog(@"%@",block3(@"我是字符串"));
    • 由以上可知,定义Block变量就相当于定义了一个函数,只有在调用block的时候才会执行其主体块{}里面的代码
  3. __block关键字的使用
    • 在Block的代码块里,是不能修改在外面定义的变量,并且在给block赋值的时候,已经对代码块里的变量做了值的拷贝(只读不可修改)。

      • int x = 5;
            int (^block4)(int) = ^(int y) {
                int z = x + y;
                return z;
            };
            NSLog(@"%d,%d",x +=5,block4(5));

        打印的值是10,10;

      • 分析:变量x在Block外定义的,在Block代码块编译的时候,取的x的值为之前的5(不可修改)。因此即使执行x += 5的使x的值变为10,但Block代码块里的x依然是5,所以block(5)的值为5+5=10。
    • 在变量前添加__block关键字进行修饰后,此变量在Block代码块里的就是可更改的(可读可写),执行代码时取变量最新的值。
      • __block int x = 5;
            int (^block4)(int) = ^(int y) {
                int z = x + y;
                return z;
            };
            NSLog(@"%d,%d",x +=5,block4(5));

        打印的值是10,15;

  4. 作为OC对象的属性,实现对象之间的传值
    • Block可以看做是一个变量,因此可以作为OC对象的属性
    • 需求:在ViewContrler的View上添加按钮,点击按钮模态跳转到FirstViewController视图控制器,FirstViewController的View上又两个按钮,一个是直接dismiss模态跳转到ViewController,一个是更改ViewController的背景色再dismiss模态跳转回ViewController
    • 分析:FirstViewController是有ViewController模态推出的视图控制器,在FirstViewController里更改ViewController的背景色,这时就要做到反向传值。
    • 实现步骤:
      1. 1.在FirstViewController.h文件里,定义将block变量作为@property属性

        • // 第一步定义, Block作为property属性
          /*
           void: Block的返回值为空,即无返回值;
           colorBlock: Block的作为对象属性时的属性名;
           (UIColor *color): Block的参数是UIColor实例对象
           */
          @property (nonatomic, copy) void(^colorBlock)(UIColor *color);
      2. 在FirstViewController.m文件里,在按钮点击触发的方法里给block传参,调用block。
        • // 随机生成的颜色
          UIColor *color = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
          // 第二步 给Block传入参数color
          if (self.colorBlock) {
              self.colorBlock(color);
          }
          [self dismissViewControllerAnimated:YES completion:nil];
      3. 在ViewController.m 文件里,实例化FirstViewController对象的地方,执行block代码块。
        • FirstViewController *fvc = [[FirstViewController alloc] init];
          // 执行Block代码块
           fvc.colorBlock = ^(UIColor *color) {
              self.view.backgroundColor = color;
          };
    • 效果展示:
时间: 2024-10-15 02:35:59

iOS开发中Block的理解与使用的相关文章

***iOS开发中@selector的理解与应用

@selector 是什么? 1一种类型 SEL2代表你要发送的消息(方法), 跟字符串有点像, 也可以互转.: NSSelectorFromString() / NSSelectorFromString() 3可以理解为类似函数指针的东西--是能让Objective-C动态调用方法的玩意.--是 object-c 的动态后绑定技术 可以通过字符串 访问的函数指针4其实就是消息响应函数---选一个消息响应的函数地址给你的action[email protected](function_name)

浅析ios开发中Block块语法的妙用

事实上,任何一个应用的开发都离开多线程.而"块"block与GCD就是苹果OC语言中多线程的核心. 一.块的内部结构 在oc中,块语法以闭包的形式存在,每一个Objective-C对象都占据着某个内存区域.块本身也是一个对象,在存放块的对象内存区域中,首个变量是指向Class的指针,该指针叫做isa.其余内存里含有块对象正常运转所需的各种信息. 以下是块语法的内部结构变量. 1.void*                                   isa(指向class的对象

iOS开发系列-Block本质篇

概述 在iOS开发中Block使用比较广泛,对于使用以及一些常规的技术点这里不再赘述,主要利用C++角度分析Block内部数据底层实现,解开开发中为什么这样编写代码解决问题. Block本质 Block本质也是一个OC对象,内部也有isa指针,最终继承NSObject.它是封装了函数调用以及函数调用环境的OC对象. 原文地址:https://www.cnblogs.com/CoderHong/p/10055004.html

[转载]对iOS开发中内存管理的一点总结与理解

对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作的理解是衡量一个程序员成熟与否的一个标准.好了,闲话不说,下面进入正题. 众所周知,ObjectiveC的内存管理引用的一种叫做“引用计数“ (Reference Count)的操作方式,简单的理解就是系统为每一个创建出来的对象,(这里要注意,只是对象,NSObject的子类,基本类型没有‘引用计数’)

全面理解iOS开发中的Scroll View

转自:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方法,但这些方法只是UIView一些属性的表面而已.因此,要想弄懂UIScrollView是怎么工作之前,你需要了解 UIView,特别是视图渲染过程的两步. 光栅化和组合 渲染过程的第一部分是众所周知的光栅化,光栅化简单的说就是产生一组绘图指令并且生成一张图片.比如绘制一个圆角矩形.带图片.标题居中的U

ios学习笔记之block在ios开发中的应用

一.什么是Blocks      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二.在ios开发中,什么情况下使用Block      Block除了能够定义参数列表.返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态.此外,这些可修改的状态在相同词法范围内的多个block之间是共享的,即便出了该词法范围

深入理解 iOS 开发中的锁

来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不会详细介绍锁的具体实现原理,这会涉及到太多相关知识,笔者不敢误人子弟. 本文要做的就是简单的分析 iOS 开发中常见的几种锁如何实现,以及优缺点是什么,为什么会有性能上

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

iOS开发中的错误整理,百思项目'我的'模块,tableFooterViewHeight的问题.提醒自己对KVO和Block的运用欠缺

一.错误分析:由于tableFooterView中的数据是通过请求服务器后得到的,tableFooterViewHeight也是根据请求过来的数据经过布局子控件而计算出来的.(注意:计算高度是在子线程中执行的),导致了给TableView设置了tableFooterView,tableFooterView的高度为0.如下图: 二.解决方案一:通过KVO监听自定义tableFooterView的高度变化 解决方案二:通过block,当自定义tableFooterView计算出高度后,才将自定义控件