`

oc block块的使用

 
阅读更多

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

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

1、参数是NSString*的代码块

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

运行结果是:print:hello world!

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

  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、代码块的递归调用

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

  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、在代码块中使用局部变量和全局变量

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

  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

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

  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

  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

分享到:
评论

相关推荐

    OC中以block形式页面传值

    其中,使用Block(代码块)是一种灵活且强大的方式。本篇文章将详细探讨OC中如何以Block形式进行页面间的数据传递。 Block是Objective-C的一个重要特性,它允许我们将一段代码封装起来作为一个对象传递。Block可以...

    OC Block深入浅出(jpg)

    对iOS中Block的介绍

    Swift 中的闭包和 Objective-C 中的Block

    Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...

    IOS block回调代码实例Demo

    在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义匿名函数,即不关联任何特定方法或函数的代码块。Block不仅可以作为局部变量、函数参数,还可以用于回调,这正是"IOS block回调代码实例Demo"所展示的...

    OC-block执行完外面的程序才执行方法本身

    标题"OC-block执行完外面的程序才执行方法本身"指的是在Objective-C中使用块时的一个关键概念:延迟执行或者异步执行。这通常与GCD(Grand Central Dispatch)或NSOperationQueue等多线程工具结合使用。 首先,理解...

    ios block学习总结demo

    Block是iOS和Mac OS开发中的一个重要概念,它是Objective-C(OC)语言的一种特性,也是Cocoa Touch框架的关键组成部分。在iOS应用开发中,Block经常被用来处理异步操作、简化回调函数、创建自定义迭代器等。下面我们...

    oc基础教程全集

    ### 第八章:块(Block) - **块**:OC中的匿名函数,常用于回调和并发编程。 ### 第九章:集合类 - **NSArray, NSMutableArray, NSDictionary, NSMutableDictionary**:分别代表不可变数组、可变数组、不可变...

    ios-block作为对象属性和返回值的展示方式.zip

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...

    iOS史上最全的OC笔记

    6. **块(Block)**:OC的块是内联函数的一种形式,可以作为参数传递和存储。笔记会阐述块的定义、类型和使用,以及如何在GCD(Grand Central Dispatch)中使用块。 7. **集合类**:OC提供了NSArray、...

    oc中数组排序

    Objective-C中的排序方法通常使用比较器块(Comparator Block),这是一个自定义比较逻辑的闭包。例如,我们可以创建一个block来比较两个对象的年龄: ```objc NSComparator compareAge = ^(id obj1, id obj2) { ...

    探索Objective-C中的Block:强大灵活的代码块

    Objective-C(通常缩写为Obj-C或OC)是一种通用的编程语言,它主要被用于苹果公司的操作系统,如macOS和iOS,以及它们的应用开发框架,如Cocoa和Cocoa Touch。Objective-C是C语言的一个超集,这意味着它包含了C语言...

    OC练习题(全套)

    6. **块(Block)**:OC中的闭包实现,可以捕获并存储执行环境中的变量,常用于异步操作和回调。 7. **内存管理**:理解ARC(Automatic Reference Counting)自动引用计数的工作原理,以及强引用、弱引用的区别,...

    (OC)App的跳转.zip

    8. **Blocks/Closures**: OC支持块(Block)语法,可以用于在函数或方法中嵌入代码块,当满足特定条件时执行,常用于实现点击事件后的异步跳转。 9. **UIStoryboardSegue Identifier**: 在Storyboard中,每个segue...

    ios-block的局部变量和全局变量和static的静态变量联系.zip

    如果在Block中使用了局部变量,那么Block会捕获这个变量的一个副本,而不是引用,这就是所谓的“捕获”。 全局变量在整个程序运行期间都存在,它们在程序的全局作用域内定义,可以被任何函数或方法访问。全局变量...

    iOS开发中必备的OC知识

    此外,块(Block)是Objective-C中的一个重要特性,它允许将代码块作为参数传递给方法,或者作为方法的返回值。块的引入极大地方便了代码的异步执行和操作闭包,提高了编程的灵活性。 Objective-C运行时(Runtime)...

    OC源代码-俄罗斯方块

    block_rotation是每种方块的几个旋转角度,数组每个元素是每种角度下,每个方块自个儿对应的坐标(一律从0_0点开始算),小方块只管记住自己的坐标,不管它所在的组是啥形状 方块定位: 就拿上图种红色L举例,索引...

    OC 中的内存管理

    - **关于自动释放池块**(About Autorelease Pool Blocks):自动释放池块(autorelease pool block)是一种特殊的内存管理结构,用于批量释放对象。 - **使用局部自动释放池块减少峰值内存消耗**(Use Local ...

    block的学习demo(回调,基本用法)

    Block是Objective-C和Swift编程语言中的一个重要特性,它允许我们定义可嵌套的代码块,可以在需要时执行。Block在iOS开发中广泛用于处理异步操作、事件响应和回调等功能。下面将详细介绍Block的声明、创建方法以及回...

    Swift5.2 Block(闭包)

    Swift中的闭包(Block)是编程语言中一种强大的特性,它允许我们定义并存储一段可调用的代码块。在Swift 5.2版本中,闭包的使用和理解仍然是开发者掌握Swift的关键部分。闭包可以捕获和存储上下文中的变量,这使得...

    OC学习总结资料

    5. **块(Block)**: OC引入了块的概念,这是一种内联函数或者匿名函数,可以捕获和存储执行上下文。块在处理异步操作、排序和过滤数据等方面非常实用。 6. **内存管理**: OC使用引用计数(Reference Counting...

Global site tag (gtag.js) - Google Analytics