Block介绍(一)

Block介绍(一)

一、概述

官方文档这是这样介绍block的

Block objects are a C-level syntactic and runtime feature. They
 are similar to standard C functions, but in addition to 
executable code they may also contain variable bindings to 
automatic (stack) or managed (heap) memory. A block can 
therefore maintain a set of state (data) that it can use to impact
 behavior when executed.

简单的说Block是C语言级别的语法。它对比C,在栈内存跟堆内软的饮用中更佳灵活。并且,block可以做为参数来传值。

二、入门

  1. 语法

在这里定义了两个block,他的名字是myBlock,返回值是前面那个int,参数是它后面括号里面的int,等于号后面是方法体。


int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

typedef 下

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

三、例子

调用一下:

-(void)aMethod
{
    BoolBlock ablock = ^(BOOL b) {
        NSLog (@"Bool block !");
    };
    
    ablock(true);
}

作为参数返回一下:

typedef void (^BoolBlock) (BOOL);
- (BoolBlock)foo{
    BoolBlock ablock = ^(BOOL b ){
        NSLog(@"BOOL block!");
    };
    
    return  ablock;
}

类的成员对象

@interface BlockTest : NSObject

typedef void (^BoolBlock)(BOOL);
@property (nonatomic,copy)BoolBlock block;

@end

BlockTest *t = [[BlockTest alloc]init];
    t.block = ^(BOOL b){
        NSLog(@"BlockTest block call");
    };
    
    t.block(true);
    

其他函数的参数

- (void)foo(BoolBlock block)
{
    if (block) {
        block();
    }
}

其他block的参数

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

全局变量

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的属性时,它的修饰符应该是copy

四、_block

在block内修改block之外的变量的时候,应该对变量天假_block标记。

    __block int a = 0;
    t.block = ^(BOOL b){
        a++;
        NSLog(@"BlockTest block call");
    };
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,896评论 0 23
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 838评论 2 1
  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 2,489评论 2 26
  • Block基础回顾 1.什么是Block? 带有局部变量的匿名函数(名字不重要,知道怎么用就行),差不多就与C语言...
    Bugfix阅读 6,934评论 5 61
  • 摘要 Blocks是C语言的扩充功能, iOS 4中引入了这个新功能“Blocks”,那么block到底是什么东西...
    CholMay阅读 1,367评论 2 10

友情链接更多精彩内容