初探Objective-c 4:OC中的Blocks

2024-06-03 06:08
文章标签 初探 objective blocks oc

本文主要是介绍初探Objective-c 4:OC中的Blocks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Blocks 是什么?

如果把OC看作C语言的超集,那么Blocks就是C语言的扩充功能。用一句话来概括Blocks:带有自动变量(局部变量)的匿名函数。

匿名函数,就是不带有名称的函数。

Blocks的基本语法

:^ 返回值类型 参数列表 表达式

^ int (int count) {return count +1;}

上面这是Blocks的基本方式。Blocks同时也可以省略一些项目。

首先是可以省去返回值类型:

^(int count){return count+1;}

此时,编译器将根据return语句的类型,返回Int型返回值。

其次,如果不实用参数,参数列表也可以省去。

^ void(void){printf();}

可以省略成下面的形式:

^{printf();}

也就是: ^ 表达式

Blocks类型变量

Blocks 变量可以看作将声明函数指针类型变量的”*”变为”^”。因此,Blocks变量可以作为以下参数:

  1. 自动变量
  2. 函数参数
  3. 静态变量
  4. 静态全局变量
  5. 全局变量
int (^bk)(int)  = ^(int count)={return count+1;}int (^bk)(int) = bk;

上面将Block语法生成的Block变量赋值给bk,同样因为类型一样,所以bk可以赋值给bk1;

Block类型变量可完全像通常的C语言变量一样使用,因此也可以使用指向Block类型变量的指针,即Block指针类型变量。

typedef int (^blk_t) int ;blk_t blk = ^(int count){return count+1;}blk_t *blkptr = &blk;
(*blkptr)(10);

截获自动变量

先来看一段代码 :

int dmy = 256;int val= 10;const char *fmt =  "val  = %d\n";void (^blk)(void) = ^{printf(fmt,val);};val =2;fmt = "this is test val = %d\n";blk();

执行结果

val  = 10
Program ended with exit code: 0

可以看到并不是输出 this is test val = 2

因为在执行到blocks的时候,block保存了val的瞬值,即使改变了blocks使用的自动变量,也不会影响Block执行时自动变量。

如果要改变局部变量,要在变量前加上 __block。

在Objective-c 高级编程中 还讲解在block的实现方法,这里才疏学浅没能很透彻的明白,还需要继续努力。

这篇关于初探Objective-c 4:OC中的Blocks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026182

相关文章

Java注解初探

什么是注解 注解(Annotation)是从JDK5开始引入的一个概念,其实就是代码里的一种特殊标记。这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。有了注解,就可以减少配置文件,现在越来越多的框架已经大量使用注解,而减少了XML配置文件的使用,尤其是Spring,已经将注解玩到了极致。 注解与XML配置各有

保姆级教学:OC监听网络状态变化 Reachability监听网络变化 ios网络变化

本文主要讲解了,在oc开发中,怎么去使用代码进行网络监听,十分的通俗易懂。 首先,在xcode工程中导入SystemConfiguration框架。 然后导入Reachability.h文件。 Reachability文件 点击下载,也可以按照如下内容创建对应的文件。 Reachability.m //文件名Reachability.m/*Copyright (C) 2016 App

oc中关于pch文件

pch 可以用来存储共享信息,比如设备屏幕的宽度,高度。版本号等等 公用信息 Xcode 老版本会自动为我们创建pch文件,新版本开始不自动创建了,如果需要使用可以自己手动创建 创建完成后可以在里面定义常量 此处以屏幕尺寸为例 如下 代码如下: 复制代码代码如下: //获取屏幕 宽度、高度 #define SCREEN_FRAME ([UIScreen

oc 图片变黑白

理论依据: 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新 存储单元的位数和显示器本身的性能。如每个象素的颜色用16位 二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777

OC中数组、字典、集合常用方法的运用

/* ====================== 一 NSArray========================          1.创建对象          1.1初始化方法(2) //一般程序有问题先检查初始化          1.2类方法          1.3字面量方法          2.数组查找          2.1通过下标访问对象[ .[i]]

iOS开发:OC篇:常用字符串方法的运用

1 NSString   .1创建 alloc init stringWith   .2获取长度.length   .3获取字符 characterAtIndex   .4前缀和后缀的判断 hasPrefix hasSuffix   .5某个字符串在另一个字符串的范围(range)(NSMakeRange) rangeOfString   .6截取(sub) substringFro

IOS Core Data框架初探

在IOS系统中已经集成了关系型数据库SqLite3数据库,但是由于在OC中直接操作C语言风格的SqLite3相对繁琐,因此Apple贴心的提供了一个ORM(Object Relational Mapping对象关系映射)框架——Core Data让我们在程序中以面向对象的方式,操作数据库。Core Data框架提供的功能相当强大,属于入门容易精通难的东西,值得我们用心专研。现在,就先记录一下我对该

OC中的分类与类扩展

在OC中,对于已有的类进行扩展,我们有两种方式: 1、在原始类的定义中,进行代码扩展。 2、通过继承的方式,扩展子类。 3、使用分类的方式。 第一、二种方式不用多说,第三种方式则是OC中比较有特色的功能。 分类允许我们在不更改类的原始代码的情况下,实现对类的功能扩展,包括:添加实例方法,类方法与实例变量,属性(添加实例变量与属性需要匿名分类——类扩展)。 如何定义分类\类扩展

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestureRecognizer和

Core Text Objective-C Wrapper

Core Text Objective-C Wrapper https://github.com/akosma/CoreTextWrapper Introduction(介绍) One of the most promising and mysterious new frameworks introduced in iOS 3.2 is Core Text. Apple define