block

#import <Foundation/Foundation.h>

// Block塊的重定義
typedef int(^aBlock)(int, int);
typedef void(^bBlock)();

// 全局變量
int a = 100;

int main(int argc, const char * argv[])
{
    // 定義block
    // block類型為有參數(shù)有返回值
    // int 表示的是返回值,(int,int)表示的是參數(shù)類型,MyBlock表示的是block塊的名字,^(托字符)的作用是block塊的標(biāo)識符
    int(^MyBlock)(int, int) = ^(int a, int b)
    {
        return a + b;
    };
    // 調(diào)用block
    int num = MyBlock(3, 4);
    NSLog(@"有參有返回值num ======%d", num);
    
    
    // 有參數(shù)無返回值
    void(^MyBlock1)(int, int) = ^(int a, int b)
    {
        NSLog(@"有參無返回值======%d",a * b);
    };
    MyBlock1(4, 5);
    
    
    // 無參數(shù)無返回值
    void(^MyBlock2)() = ^()
    {
        NSLog(@"無參無返回值======你瞅啥!!");
    };
    MyBlock2();
    
    
    // 無參數(shù)有返回值
    int(^MyBlock3)() = ^
    {
        int a = 3;
        int b = 5;
        int c = a + b;
        return c;
    };
    NSLog(@"無參數(shù)有返回值 ======%d",MyBlock3());
    
    
    // Block與全局變量、局部變量的關(guān)系:
    // a是全局變量,存放在全局區(qū)(靜態(tài)區(qū));c是局部變量,存放在棧區(qū)
    NSLog(@"a = %d, 地址:%p", a, &a);
    int c = 10;
    NSLog(@"c = %d, 地址:%p", c, &c);
    void(^myBlock)() = ^()
    {
        // block里可以訪問外面的全局變量,并修改值;也可以訪問外面的局部變量,但是不能改值
        a = 8;
        // a的地址沒變
        NSLog(@"a = %d, 地址:%p", a, &a);
        
        // 這里c存放在堆區(qū),block內(nèi)部的局部變量,地址是拷貝過來的,存放在堆區(qū)
        NSLog(@"c = %d, 地址:%p", c, &c);
    };
    myBlock();
    
    // 如果想在block內(nèi)部改變外部的值:
    __block int d = 10;
    NSLog(@"d = %d, 地址:%p", d, &d);
    void(^block)() = ^()
    {
        d = 12;
        NSLog(@"d = %d, 地址:%p", d, &d);
    };
    block();
    NSLog(@"d = %d, 地址:%p", d, &d);
    
    return 0;
}
demo截圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容