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:位於堆內存。 
注:參考網上某個大神的寫的。
相關文章
相關標籤/搜索