一、Block语法

Block:块语法,本质上是匿名函数(没有名称的函数),Block变量存放函数的实现,通过Block变量能直接调⽤函数。标准C里面没有Block。C语言的后期扩展版本号。加⼊了匿名函数。C++、JS、Swift等语⾔,有相似语法。叫做闭包。

Block语法和函数指针非常相似。

  • Block类型:int (^)(int)
  • Block变量:myBlock
  • Block值:^ int (int num){ return 7 * num;}
  • 即:^ 返回值类型 (參数列表){函数体} 当中 返回值类型 能够省略。
        /* Block 类型: int (^)(int, int)
* Block 变量: block1
* Block 的值: ^int (int x, int y) { return x + y; };
^ 返回值类型 (參数列表) { 函数体 } (返回值类型能够省略)
*/ /* 1. 无返回值, 无參数的Block */
void (^block3)() = ^()
{
NSLog(@"Hello, World!");
};
block3(); /* Block调用 */ /* 2. 无返回值, 有參数 */
void (^block4)(int, int) = ^(int x, int y)
{
NSLog(@"%d", x + y);
};
block4(3, 45); /* 3. 有返回值, 无參数 */
int (^block5)() = ^()
{
return 100;
};
NSLog(@"%d", block5()); /* 4. 有返回值, 有參数 */
int (^block6)(int, int) = ^(int x, int y)
{
return x > y ? x : y;
};
NSLog(@"%d", block6(3, 5));

二、Block使⽤

int (^block1)(int x, int y) = ^(int x, int y) {
return x + y;
};
int a = block1(32, 34); // block的使⽤和函数指针的使用相似
NSLog(@“%d”, a); // 打印结果:66

Block进⾏typedef

  • typedef int (^BlockType)(int x, int y)

  • 原类型:int (^)(int x, int y)

  • 新类型:BlockType

/* Block typedef */
typedef int(^blockType)(int, int); blockType block1 = ^(int x, int y) {
return x + y;
};
NSLog(@"%d", block1(3, 5));

Block写法

int (^block1)(int x, int y) = ^(int x, int y) {
return x + y;
};
BlockType block1 = ^(int x, int y) {
return x + y;
};

上述两种实现是等价的。

Blcok与局部变量和全局变量

        /* main函数外定义的全局变量 */
int n = 100; /* 知识点4 Block与局部变量 全局变量 */
/* 局部变量 */
int a = 100; int (^block)() = ^() {
return a;
};
NSLog(@"%d", block()); int (^block2)() = ^() {
// a = 200;
return a;
};
/* 总结: 默认情况下, block能够訪问但不能更改局部变量 */ __block int b = 200;
int (^block3)() = ^() {
b = 300;
return b;
};
NSLog(@"%d", block3());
/* 总结: 用__block修饰的局部变量, Block里面能够更改值 */ /* Block 与全局变量 */ int (^block4)() = ^() {
n = 200;
return n;
};
NSLog(@"n = %d", block4()); static int num = 1;
int (^block5)() = ^() {
num = 8;
return num;
};
NSLog(@"num = %d", block5());

Objective-C_Block的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  3. Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法

    NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...

  4. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  5. Objective C运行时(runtime)

    #import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...

  6. Objective C ARC 使用及原理

    手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...

  7. Objective -C学习笔记之字典

    //字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...

  8. 刨根问底Objective-C Runtime

    http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...

  9. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  10. Objective C类方法load和initialize的区别

    Objective C类方法load和initialize的区别   过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...

随机推荐

  1. this和$(this)的关系

    环境关键字this引用的是DOM元素 $(this)是jQuery对象 下面点击按钮分别alert一下 alert(this); alert($(this)); 获取DOM对象的属性id,可以 $(t ...

  2. 【转载】【Todo】电商架构相关技术分析

    看了一篇文章: http://kb.cnblogs.com/page/193670/    淘宝应对"双11"的技术架构分析 没怎么看懂,有时间再看.

  3. C#接收xmlrpc接口返回哈希表格式

    C#在调用xmlrpc接口时返回的是int值就可以直接获取,最近在调用一个接口是获取一个账号记录的详细信息,xmlrpc接口返回的是一个哈希值. 所以直接用int或者Hashtable 来获取返回值执 ...

  4. 流畅的python第八章对象引用,可变性和垃圾回收

    变量不是盒子 在==和is之间选择 ==比较两个对象的值,而is比较对象的标识 元组的相对不可变姓 元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用.如果引用的元素是可变的 ...

  5. Oracle 命令导入数据

    1.用命令进入sqlplus: sqlplus 用户名:/orcl 2.执行sql文件 sql>@D:/lanxi_his_data/V_JH_VISITINFO.sql

  6. tomcat 部署 RESTful 服务实例

    1.建立简单restfule服务 参考:java 利用JAX-RS快速开发RESTful 服务实例 简单代码: package com.example; import javax.ws.rs.GET; ...

  7. 第二章:ES索引说明

    1."_boost": 20评分的权重(排序) 2."analyzer": "ik"中文分词 "analyzer": & ...

  8. MR 数据过滤

    MR: package com.euphe.filter; import com.euphe.util.HUtils; import com.euphe.util.Utils; import com. ...

  9. 不要在基类析构函数中调用纯虚函数,否则运行时会报错“pure virtual method called”

    如上. 这是因为:delete派生类对象时,先调用派生类的析构函数,然后再调用基类的析构函数:此时如果调用纯虚函数的话,派生类的对象已经被破坏了,所以会报错. http://www.cnblogs.c ...

  10. mysql有关问题之:the security settings could not be applied to

    mysql问题之:the security settings could not be applied to 转自:http://www.myexception.cn/mysql/503556.htm ...