iOS开发学习48 OC的lambda block

Posted 编程圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发学习48 OC的lambda block相关的知识,希望对你有一定的参考价值。

一、block 简介

Block是苹果在ObjectC为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包。
block不需要写protocol、函数等、注重结果的传输,写法比委托简便。
block的声明:

<返回值类型> + (^<block名字>) + (<参数类型1>, <参数类型2>...)

二、block使用

1. block的写法大概就是这样:

void (^blockTest)(void) = ^{
    NSLog(@"block");
};

blockTest();

2. 带参数的话可以这样写:

^ BOOL (int left, int right){
	return a > b;
}

3. 如果不写入参,可以写:

    (void)^{
        NSLog(@"block的使用");}
    ;

4. 当然返回也可以省略,不过编译器可能会有警告:

    ^{
        NSLog(@"最简捷的block的使用");}
    ;

5. 定义一个block的变量:

    void (^blockWithParm)(int parm) = ^(int count){
        NSLog(@"有参无返回值的定义和使用:%d", count);
    };
    blockWithParm(100);

6. block就可以作为另一个函数的参数

void a(){
    void (^block)(int parm) = ^(int count){
        NSLog(@"有参无返回值的定义和使用:%d", count);
    };
    // 把block 传到funcWithParm里作为参数
    funcWithParm(block);
}

void funcWithParm(void (^block)(int parm))
{
    block(10);
}

7. block 作为类的属性(使用typedef)

在头文件中定义

typedef void (^blockTest)(); 
@property (nonatomic,copy) blockTest myblock;  

在m文件中调用:

if(_myblock){
_myblock();
}

其它类使用该属性

_testClass.myblock = ^{
 NSLog(@"block");
}

三、OC自带的使用block的API示例

遍历元素

    NSArray *arrChar=[@"A/B/C/D/E/F" componentsSeparatedByString:@"/"];
    //遍历元素
    [arrChar enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"\\nindex:[%d], value:[%@]",idx,obj);
        if(idx == 4)
        {
            *stop=YES;
        }
    }];

以上是关于iOS开发学习48 OC的lambda block的主要内容,如果未能解决你的问题,请参考以下文章

小白学开发(iOS)OC_ block数据类型(2015-08-08)

[OC学习笔记]Block三种类型

iOS开发系列-Block本质篇

32-oc block

高效 OC开发之Block和GCD

iOS OC语言: Block底层实现原理