一、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. 网络上的等待事件 —— SQL*Net message from client/dblink

    SQL*Net message from client SQL> select event#,name,parameter1,parameter2,parameter3 from v$event ...

  2. python Parent.__init()和super(Child, self)的区别

    super函数做的事情 def supper(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] inst生成父 ...

  3. lumisoft邮件头不规范造成内容无法读取

    解决邮件内容为multipart,并且Param_Boundary等于null的不规范邮件内容无法读取问题,这样的邮件内容头部往往带两个或多个ContentType. 红色为自己加的,绿色为注释掉原来 ...

  4. 动态加入改动删除html表格内容

    1.需求 须要实现收银台上加入改动删除商品信息时顾显能够实时看到其变化 2.解决 收银台和顾显通过tcp传输进行数据通信,顾显通过操作html中的表格进行数据加入改动和删除操作 3.代码 mytest ...

  5. Hive计算的临时文件清理

    hive 的存储路径的 .hive-staging_hive_yyyy-MM-dd_HH-mm-ss_SSS_xxxx-x 文件可以清理掉吗 https://blog.csdn.net/sparkex ...

  6. scala 内部类

    scala内部类不同于java内部类, java类中内部类从属于外部类,而scala的内部类从属于外部类对象 /** * 第一种方式 * 在内部类通过 外部类.this.成员名称 访问外部类成员 */ ...

  7. 转:用十条命令在一分钟内检查Linux服务器性能

    转自:http://www.infoq.com/cn/news/2015/12/linux-performance?utm_campaign=rightbar_v2&utm_source=in ...

  8. chrome浏览器 提示Adobe Flash Player未安装的解决方法

    最近遇到了个flash player设置的一个问题,记录一下,可能不同浏览器版本和设置不一样 浏览器版本:版本 61.0.3163.100(正式版本) (64 位) 打开需要flash player的 ...

  9. phpMailer中文说明[转]

    A开头: $AltBody--属性出自:PHPMailer::$AltBody文件:class.phpmailer.php说明:该属性的设置是在邮件正文不支持HTML的备用显示 AddAddress- ...

  10. 病毒木马查杀实战第015篇:U盘病毒之脱壳研究

    前言 因为我们的终于目标是编写出针对于这次的U盘病毒的专杀工具.而通过上次的分析我们知道,病毒有可能在不同的计算机中会以不同的名称进行显示.假设真是如此,那么就有必要在此分析出病毒的命名规律等特征,然 ...