Block

1、前言
     block是iOS4.0+和Mac oxX 10.6之后引进的对C语言的拓展,用来实现匿名函数的特性。所谓匿名函数,也成闭包函数,即容许建立一个临时的没有指定名称的函数。最常常做回调函数(callback)参数的值,也有其余用法,好比做为一个变量值来使用。
2、基础知识
     一、再iOS中,使用脱字符”^”来声明一个block变量,block的内容包含在{}中,而且和C语言同样用“;”来表示语句的结束。具体定义以下图:
若是没有参数则参数名num能够省略。
 
     二、定义一个简单的没有返回值,没有参数的block,以下:
- (void)viewDidLoad {
    [super viewDidLoad];
   
    //block
    void(^myBlock)(void)  = ^(void) {
        NSLog(@"This is a block without parameter and returned value");
    };
    myBlock();
}
也能够直接写成:
- (void)viewDidLoad {
    [super viewDidLoad];
   
    //block
    void(^myBlock)(void)  = ^ {
        NSLog(@"This is a block without parameter and returned value");
    };
    myBlock();
}
三、定义一个简单的有参数没有返回值的block,以下:
//有参数,没有返回值的block
-(void)blockWithParameterButNoReturnData
{
    void(^myBlock)(int) = ^(int num) {
        NSLog(@"%d",num*100);
    };
    myBlock(4);
}
四、定义一个有参数,有返回值得block,以下:
//有参数,有返回值的block
-(void)blockWithParameterAndReturnValue
{
    int (^myBlock)(int) = ^(int num) {
        return num * 100;
    };
   int result =  myBlock(2);
    NSLog(@"This is a block with parameter and return value :%d",result);
}
五、如今分析一下block的存储域:
运行下面函数:
-(void)testBlock
{
    void(^blockOne)(void) = ^ {
        NSLog(@"This is block one");
    };
    int c = 10;
    void(^blockTwo)(void) =^(void) {
        NSLog(@"This is a block two %d",c);
    };
    void(^blockThree)(void) =[blockTwo copy];
    NSLog(@"blockOne address is :%@",blockOne);
    NSLog(@"blockTwo address is :%@",blockTwo);
    NSLog(@"blockThree address is :%@",blockThree);
}
运行结果以下:
结果是:
blockOne由于没有使用任何外部变量,他的存储区域在全局区,而blockTwo由于使用了外部变量,则存储在堆。而两个内存地址同样,都位于堆内存中。
另附:
     Block再内存中的位置分为三种类型:NSGlobalBlock、NSStackBlock、NSMallocBlock
     其中:NSGlobalBlock:相似函数,位于text段
               NSStackBlock:位于栈内存,函数返回后Block将无效
               NSMallocBlock:位于堆内存。 
注:参考网上某个大神的写的。
相关文章
相关标签/搜索