Block介绍(一)基础

一、概述

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

 

二、热身

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

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

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

来,让我们typedef一下

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

三、更详细的例子

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

主动调用一下:
1
2
3
4
5
6
7
8
- ( void )someMethod
{
     BoolBlock ablock = ^( BOOL bValue) {
         NSLog ( @ "Bool block!" );
     };
 
     ablock();
}
作为参数返回:
1
2
3
4
5
6
7
8
typedef void (^BoolBlock)( BOOL );
- (BoolBlock)foo()
{
     BoolBlock ablock = ^( BOOL bValue) {
         NSLog ( @ "Bool block!" );
     };
     return [[ablock copy ] autorelease ]; //一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
}
类的一个成员:
1
2
3
4
5
6
7
8
@interface OBJ1 : NSObject
@property ( nonatomic , copy )BoolBlock block; //理由同上啊,同学们
@end
 
OBJ1 *obj1 = ...
obj1.block = ^( BOOL bValue) {
         NSLog ( @ "Bool block!" );
     };
其他函数的参数:
1
2
3
4
5
6
- ( void )foo(BoolBlock block)
{
     if (block) {
         block();
     }
}
甚至其他block的参数:
1
2
3
4
BoolBlock bBlock = ^( BOOL bV){ if (Bv){ /*do some thing*/ }};
HugeBlock hBlock = ^(BoolBlock bB) {bB();};
 
hBolck(bBlock);
啊,全局变量!:
1
2
3
4
5
6
static int (^maxIntBlock)( int , int ) = ^( int a, int b){ return a>b?a:b;};
int main()
{
     printf( "%d\n" , maxIntBlock (2 ,10 )); 
     return 0 ;
}

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

 

四,特殊的标记,__block

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值