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

代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:

按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); // result是 28

1、参数是NSString*的代码块

[cpp] view
plain
copy

  1. void (^printBlock)(NSString *x);  
  2. printBlock = ^(NSString* str)  
  3. {  
  4.     NSLog(@"print:%@", str);  
  5. };  
  6. printBlock(@"hello world!");  

运行结果是:print:hello world!

2、代码用在字符串数组排序

[cpp] view
plain
copy

  1. NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];  
  2. NSComparator sortBlock = ^(id string1, id string2)  
  3. {  
  4.     return [string1 compare:string2];  
  5. };  
  6. NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];  
  7. NSLog(@"sortArray:%@", sortArray);  

运行结果:sortArray:(

    "abc 05",

    "abc 1",

    "abc 12",

    "abc 13",

    "abc 21"

)

3、代码块的递归调用

代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用

[cpp] view
plain
copy

  1. static void (^ const blocks)(int) = ^(int i)  
  2. {  
  3.     if (i > 0) {  
  4.         NSLog(@"num:%d", i);  
  5.         blocks(i - 1);  
  6.     }  
  7. };  
  8. blocks(3);  

运行打印结果:

num:3

num:2

num:1

 4、在代码块中使用局部变量和全局变量

在代码块中可以使用和改变全局变量

[cpp] view
plain
copy

  1. int global = 1000;  
  2. int main(int argc, const char * argv[])  
  3. {  
  4.     @autoreleasepool {  
  5.         void(^block)(void) = ^(void)  
  6.         {  
  7.             global++;  
  8.             NSLog(@"global:%d", global);  
  9.         };  
  10.         block();  
  11.         NSLog(@"global:%d", global);  
  12.     }  
  13.     return 0;  
  14. }  

运行打印结果:

global:1001

global:1001

而局部变量可以使用,但是不能改变。

[cpp] view
plain
copy

  1. int local = 500;  
  2. void(^block)(void) = ^(void)  
  3. {  
  4.       local++;  
  5.     NSLog(@"local:%d", local);  
  6. };  
  7. block();  
  8. NSLog(@"local:%d", local);  

在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block

[cpp] view
plain
copy

  1. __block int local = 500;  
  2. void(^block)(void) = ^(void)  
  3. {  
  4.     local++;  
  5.     NSLog(@"local:%d", local);  
  6. };  
  7. block();  
  8. NSLog(@"local:%d", local);  

运行结果:local:501

                    local:501

时间: 2024-08-04 04:40:19

Objective-C语法之代码块(block)的使用的相关文章

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

本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解>,继续对比介绍它们两者之间的差异,以便我们从C#阵营过来的人员加深印象,深入了解Objective-C语言的特性.本篇随笔主要针对Objective-C里面的代码块(block)和异常处理概

深入理解Ruby中的代码块block特性_ruby专题

block是什么? 在Ruby中,block并不罕见.官方对block的定义是"一段被包裹着的代码".当然,我觉得这样的解释不会让你变的更明白. 对block的一种更简单的描述是"一个block就是一段存储在一个变量中的代码,它和其他的对象一样,可以被随时的运行" 然后,咱们通过看一些代码,之后再把这些代码重构成Ruby中的block形式.通过代码来实际的感受,更加直观. 比如,对两个数做加法? puts 5 + 6 # => 11 嗯,这样写是可以的.但是,

iOS开发系列--Objective-C之协议、代码块、分类

概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但是我们都可以在其中找到他们的影子,在文章中我也会对比其他语言进行介绍,这一节的重点内容如下: 协议protocol 代码块block 分类category 协议protocol 在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法.熟悉面向对象的童鞋都知道接口本身是对

全面解析Objective-C中的block代码块的使用_IOS

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

ios block 逆传-纯代码写block逆传值,代码块应该写在哪个方法里

问题描述 纯代码写block逆传值,代码块应该写在哪个方法里 如果是用纯代码写block逆传值,Apush到B,从B中传值到A,在B中定义block,调用block. 在A中准备代码块,这个准备的代码块在哪个方法里写? 如果是用storyBoard创建的话,在prepareForSegue方法里写,但是纯代码不知道在哪儿. 也就是B中调用[self.navigationController popViewControllerAnimated:YES]这个方法之后 ,A中该调用哪个方法 解决方案

Ruby中的block代码块学习教程_ruby专题

1.什么是代码块在Ruby中,{}或do...end之间的代码是一个代码块.代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用.例如: [1,2,3,4,5].each { |i| puts i } [1,2,3,4,5].each do |i| puts i end 块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数.  竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一

iOS - OC Block 代码块

前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个匿名函数,它和传统的函数指针很类似,但是 Block 是 inline(内联函数)的,并且默认情况下它对局部变量是只读的. 苹果官方建议尽量多用 Block.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多. Block 语法 // Block as a local variable ret

iOS - Block 代码块

1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个匿名函数,它和传统的函数指针很类似,但是 Block 是 inline(内联函数)的,并且默认情况下它对局部变量是只读的. 苹果官方建议尽量多用 Block.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多. Block 语法 // Block as a local variabl

Ruby的代码块、迭代子和过程对象

在Ruby的一切都是一个对象.甚至一个代码块也是一个对象!在Ruby中,代码对象被称为代码块.你可以把代码块想像成小的程序单元.它们包含Ruby代码并且能够在执行它们时转入到方法中.在Python,C和Java中与之类似的概念是函数指针,匿名函数,内部类和回调函数. Ruby代码块的语法是,把Ruby代码放在大括号之间或放在do/end命令之间.如下所示: { #这是一个代码块... } do #...并且这也是一个代码块 end 在一个很简单的实例中,{puts"hello world&quo