一、block声明

1、无参数,无返回值: void (^sayHi)();

2、有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num);

block的声明:返回值类型(^block变量名)(参数列表)

脱字符(^)是块的语法标记

二、block实现

block变量名 = ^返回值类型(参数列表)

1、  sayHi = ^{

NSLog(@"你好");

};

2、 operateOfValue = ^ NSInteger (NSInteger num) {

return - num;

};

注意:block的声明和实现可以写在一起,例如:

NSInteger (^maxValue)(NSInteger num1, NSInteger num2) = ^ NSInteger (NSInteger num1, NSInteger num2){

return  num1 > num2 ? num1 : num2;

};

三、block调用

block变量名(参数)

NSLog(@"相反数 = %ld", operateOfValue(- 10));

四、block作为方法的参数

1、创建一个Person类

2、Person.h  声明               block作为参数    返回值     参数

+ (void) personWithExecute:(void (^)(void)) block;

3、Person.m实现

+ (void)personWithExecute:(void (^)(void))block {

if (block) {      // 如果block存在

block();

    }

    }

4、main.m中调用

[Person personWithExecute:^{

NSLog(@"打招呼");

}];

注意: 程序运行过程 ---》 先走类方法,在实现文件中走block(),回调 -- NSLog

五、block对参数的访问

1、block对其外面的局部变量,只能读,如果非要对其做修改,需要在定义外部参数是在其前面加上__block(两个下划线),例如:

        __block int  a = 10;

void (^block)(void) = ^{

a = 30;

NSLog(@"block -  %d", a);

};

block ();

2、block对于对象类型,可读可写,可以直接进行修改,例如:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"2", nil];

void (^arrayBlock)(void) = ^{

[array addObject:@"3"];

NSLog(@"arrayBlock -- %@", array);

};

arrayBlock();

六、typedef  block

block代码块定义和实现看起来都有很大一块,可以用typedef重命名:

示例1:

1、Person.h:

typedef  block返回类型(^)重命名名字(参数列表)

typedef NSInteger (^SUMBLOCK)(NSInteger a, NSInteger b);

+ (NSInteger)sumOfNum1:(NSInteger)num1 andNum2:(NSInteger)num2 sumBlock:(SUMBLOCK)block;

2、Person.m :

+ (NSInteger)sumOfNum1:(NSInteger)num1 andNum2:(NSInteger)num2 sumBlock:(SUMBLOCK)block {

return block(num1, num2);

}

示例2:

typedef void(^SAYHI)(void);    // 相当于定义一个类型

SAYHI sayHi = ^{

NSLog(@"你好");

};

sayHi();

初学Objective - C语法之代码块(block)的更多相关文章

  1. Objective-C语法之代码块(block)的使用

    代码块本质上是和其它变量相似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你能够像调用其它标准函数一样,传入參数数,并得到返回值. 脱字符(^)是块的语法标记.依照我们熟悉的參数语法规约所定 ...

  2. Objective-C语法之代码块(block)的使用 (转载)

    代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定 ...

  3. 代码块(block)的使用

    Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...

  4. 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  5. Objective-C-----协议protocol,代码块block,分类category

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...

  6. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  7. [转]iOS代码块Block

    代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要 ...

  8. iOS学习之代码块(Block)

    代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: ;//注意:全局变量 ...

  9. 一篇文章看懂iOS代码块Block

    block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返 ...

随机推荐

  1. mitmproxy 在windows上的使用

    mitmproxy 是一个中间件代理, 结合python使用 安装  pip install mitmproxy 在windows上没有mitmproxy 所以只要用mitmdump和mitmwdb ...

  2. DMZ靶场渗透

    0x00 目标站点www.test.ichunqiu 0x01 尝试登陆系统 -尝试弱密码登陆 结果:forbidden!!! -尝试万能账号密码登陆 1‘ or 1=1--+ 和 1‘ or 1=1 ...

  3. spring源码-aop动态代理-5.3

    一.动态代理,这是一个很强大的东西哦.研发过程中我们会常用很多业务类,但是存在一个问题.如何在不修改源码逻辑的情况下,加入自己的相关逻辑.比如异常处理,日志记录等! 二.Java动态代理的两种方式JD ...

  4. 八、Django之Models(译)

    模型(Models) 模型是你的数据的唯一的.确定的信息源. 它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是一个Python类,它们都是djang ...

  5. vbox虚拟机扩容(CentOS 7.2)

    Preface   My virtual machine was simply created by vagrant in default mode without anything about th ...

  6. exe4j 使用记录(一):下载、安装及注册

    一.下载 exe4j下载地址:https://www.ej-technologies.com/download/exe4j/files 进入下载页面,可以选择exe4j版本. 选择完成后,下载即可. ...

  7. Linux中新增硬盘的分区,格式化与挂载

    Linux中新增硬盘的分区,格式化与挂载 本篇教程内容为怎样对Linux新增硬盘进行挂载,所以如果有准备新增硬盘但是有各种问题的,请参看本篇教程. 我们先说说什么是挂载? 我们知道Linux中的所有设 ...

  8. selenium、unittest——POM框架并出报告

    学习隔壁大神的POM框架,结合自己的用例进行修改整理并执行,操作遇到的主要问题是如何分布的写各个模块并统一运行,每个文件夹想要import里面的模块需要有__init__模块 POM主要分为三个部分, ...

  9. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  10. VR电竞游戏在英特尔®架构上的用户体验优化

    作为人与虚拟世界之间的新型交互方式,VR 能够让用户在模拟现实中获得身临其境的感受.但是,鉴于 VR 的帧预算为每帧 11.1ms (90fps),实现实时渲染并不容易,需要对整个场景渲染两次(一只眼 ...