Block介绍(一)基础

本文详细介绍了Objective-C中的Block概念,包括其基本使用、特殊标记__block的应用以及如何与其他函数参数交互。Block在Objective-C中提供了强大的灵活性,用于简化回调、事件处理和函数间的数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、概述

BlockC级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block

 

二、热身

先看一个比较简单的Block例子:

[objc] view plaincopy


  1. int multiplier = 7;  
  2. int (^myBlock)(int) = ^(int num) {  
  3.     return num * multiplier;  
  4. };  

在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

来,让我们typedef一下

[objc] view plaincopy


  1. typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block  
  2. typedef int (^IntBlock)(void);//一个没有参数,返回intblock  
  3. typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block  

[objc] view plaincopy


  1.    

三、更详细的例子

注意,上面的typedef都还有效~

主动调用一下:

[objc] view plaincopy


  1. - (void)someMethod  
  2. {  
  3.     BoolBlock ablock = ^(BOOL bValue) {  
  4.         NSLog(@"Bool block!");  
  5.     };  
  6.   
  7.     ablock();  
  8. }  

作为参数返回:

[objc] view plaincopy


  1. typedef void (^BoolBlock)(BOOL);  
  2. - (BoolBlock)foo()  
  3. {  
  4.     BoolBlock ablock = ^(BOOL bValue) {  
  5.         NSLog(@"Bool block!");  
  6.     };  
  7.     return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解  
  8. }  

类的一个成员:

[objc] view plaincopy


  1. @interface OBJ1 : NSObject  
  2. @property (nonatomiccopy)BoolBlock block;//理由同上啊,同学们  
  3. @end  
  4.   
  5. OBJ1 *obj1 = ...  
  6. obj1.block = ^(BOOL bValue) {  
  7.         NSLog(@"Bool block!");  
  8.     };  

其他函数的参数:

[objc] view plaincopy


  1. - (void)foo(BoolBlock block)  
  2. {  
  3.     if (block) {  
  4.         block();  
  5.     }  
  6. }  

甚至其他block的参数:

[objc] view plaincopy


  1. BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};  
  2. HugeBlock hBlock = ^(BoolBlock bB) {bB();};  
  3.   
  4. hBolck(bBlock);  

啊,全局变量!:

[objc] view plaincopy


  1. static int(^maxIntBlock)(intint) = ^(int a, int b){return a>b?a:b;};  
  2. int main()  
  3. {  
  4.     printf("%d\n", maxIntBlock(2,10));    
  5.     return 0;  
  6. }  

好了,你知道block大概能怎么用了。

 

四,特殊的标记,__block

如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

[objc] view plaincopy


  1. int main()  
  2. {  
  3.     __block int i = 1024;  
  4.     BoolBlock bBlock = ^(BOOL bV) {  
  5.         if (bV) {  
  6.             i++;//如果没有__block标记,是无法通过编译的。  
  7.         }  
  8.     };  
  9. }  

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值