OC学习笔记之block


一、什么是block
        block是OC中的一个数据类型,但是它很特别,因为它是用来保存一段代码的(可以理解为把一段代码赋值给block类型的变量)。它和函数有点相似,它可以带参数,可以有返回值,调用方式也一样。
二、定义一个不带形参没有返回值的block

//
//  main.m
//  block
//
//  Created by 葬花 桥 on 14-5-13.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

int main()
{
    void (^myBlock)() = ^{ // 定义并赋值block
        NSLog(@"block你好");
    };

    myBlock(); // 调用block
    
    return 0;
}



        
  三、带参数有返回值的block

//
//  main.m
//  block
//
//  Created by 葬花 桥 on 14-5-13.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

int main()
{
//    void (^myBlock)() = ^{ // 定义并赋值block
//        NSLog(@"block你好");
//    };
//
//    myBlock(); // 调用block
    
    int (^sumBlock)(int, int) = ^(int a, int b){ // 定义block并赋值
        return a + b;
    };
    
    int c = sumBlock(1, 2); // 调用block
    
    NSLog(@"sumBlock返回值为%d",c);
    
    return 0;
}


     

        
三、block与函数指针
        block与函数指针是非常相似的,小桥在这里演示一下:

//
//  main.m
//  block
//
//  Created by 葬花 桥 on 14-5-13.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>


int sum(int a, int b)
{
    return a + b;
}

int main()
{
    int (*p)(int, int) = sum; // 定义函数指针
    
    NSLog(@"sum返回值为%d", p(3, 4));
    
    return 0;
} 

       

        上面的指针p就是一个指向函数的指针,函数指针在c语言中用的比较多,特别是linux系统内核中,c语言用结构体并且在结构体中用函数指针来模拟类的方法,用以达到面向对象的效果,所以说面向对象编程是一种思想而不是一种特定的编程语言,这是题外话。
        如果用block来写同样的求和功能,是这样的:

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    int (*p)(int, int) = sum; // 定义函数指针
    
    NSLog(@"sum返回值为%d", p(3, 4));
    
    
    int (^sumBlock)(int, int) = ^(int a, int b){
        return a + b;
    };
    NSLog(@"sumBlock返回值为%d", sumBlock(4, 5));

    
    return 0;
} 



 
四、block与typedef
        复杂类型可以用typedef来定义简洁的形式,这在C++的可视化编程的MFC框架中经常见到,一些奇怪的数据类型其实是已知类型的另一种形式。
        typedef把block的定义重新定义成一个简洁的形式,如:
  
int sum(int a, int b)
{
    return a + b;
}

typedef int (*sumP)(int, int); // 定义一个sumP类型,它可以定义出一个返回值为int,两个int形参的函数指针
typedef int (^myBlock)(int, int); // 定义一个myBlock类型,它可以定义出一个返回值为int,两个int形参数的block变量

int main()
{
    int (*p)(int, int) = sum; // 定义函数指针
    
    NSLog(@"sum返回值为%d", p(3, 4));
    
    
    int (^sumBlock)(int, int) = ^(int a, int b){
        return a + b;
    };
    NSLog(@"sumBlock返回值为%d", sumBlock(4, 5));

    sumP p2 = sum; // 定义一个函数指针p2
    NSLog(@"%d", p2(10, 11));
    
    
    myBlock sumBlock2 = ^(int a, int b){
        return a + b;
    };
    NSLog(@"%d", sumBlock2(12, 13));
    return 0;
}


        所以,如果需要多个block,返回的都是int,参数都是两个int,那么就可以用typedef定义的myBlock类型继续定义多个block变量,功能可以不一样,可以是两个int的加,减,除等等。这样做可以减少代码量,小桥觉得主要还是在代码上增加可读性,我们对
 
int  a;
这种形式很熟悉,但是对
int  (^sumBlock)( int int )
这种形式就不那么熟悉了,所以用typedef定义后的
  myBlock sumBlock2;
就变成我们熟悉的语法了。 
  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值