黑马软件工程师-OC学习笔记之block

黑马程序员-OC学习笔记之block
 
---------------------- IOS开发、Android培训、期待与您交流! ----------------------
一、什么是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;
}


黑马软件工程师-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
    
    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;
} 


黑马软件工程师-OC学习笔记之block
 
四、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;
}

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

 

---------------------- IOS开发、Android培训、期待与您交流! ---------------------- 详细请查看:www.itheima.com