Block

一 block的概念和基本使用

1.bloc的概念
block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码意外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。
你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程。作为一个回调,block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
2.block的基本使用
用^操作符来声明一个block变量,并指明block述句的开始。block的主体包含在{}內,像下面的例子中一样(与C语法一样,”;”指明语句的结束):
int multiplier = 7;

int (^myBlock)(int) = ^(int num)}{return num * multipiler;};//int 是block的返回值,myBlock是一個塊對象,(int)是參數的類型。num是參數的名稱。{return .....};是塊對象的主體部分。

block的定義和使用
/*
    定義格式:
        返回類型(^block名稱)(參數列表) = ^返回類型(參數列表){代碼實現};
*/
//無參無返回值
void(^myBlock)() = ^{
        NSLog(@"hello");
};
myBlock(); //調用方法

//有參無返回值
void(^sumBlock1)(int, int) = ^(int x, int y){
    NSLog(@"x + y = %d", x + y);
};
sumBlock(10, 20)p; //調用方法

//有參有返回值
int (^sumBlock2)(int, int) = ^int(int a, int b){
    return a+b;
};

NSLog(@"%d", sumBlock2(4, 8));//調用方法

二 block的typedef

利用typedef定義block類型(和指向函數的指針很像)

格式:

/*
typedef 返回值類型(^block變量名)(參數類型列表);
typedef int(^MyBlock)(int, int);
*/
//給無參無返回值block變量起別名:
//格式:void(^新類型名)();
typedef void (^newType)();
newType t1;
t1 = ^{
NSLog(@"我是使用newTypede定義出來的變量t1的值");
};
t1(); //使用block

//定義有參無返回值block變量別名
typedef void (^newType2)(int, int);

newType2 t2;
t2 = ^(int x, int y){
    NSLog(@"x+y = %d", x+y);
};
t2(23, 12);

//有參又返返回值
typedef int (^newType3)(int, int);
newType3 t3;
t3 = ^(int a, int b){
    return a+b;
};
NSLog(@"a + b = %d", t3(10, 20));

三 block訪問外部變量

1)在block內部可以訪問block外部的變量
在block內部可以訪問變量,但是注意,這是一個新的內存空間變量
//block外部定義的變量
int m = 10
//定義block
void (^myBlock)() = ^{
    NSLog(@"m = %d", m);
};

//使用block
myBlock();
2)在block內部不可以修改block外部的變量
默認情況下,block內部不能修改外部的局部變量
//block外部定義的變量
int m = 10;

//定義block
void (^myBlock)() = ^{
    m = 100; //這樣寫,編譯器會報錯
    //若果打印出變量m的地址的話,就可以看到block內部的m和block外部的m的地址並不一樣,說明block內部的m是新分配的一塊內存,並且block內部的變量是只讀的
}

//給局部變量加上__block關鍵字,則這個局部變量可以在block內部修改
main(int argc, const char * argv[]){
    @autoreleasepool{
        //block外部定義的變量
        __block int m = 10;

        //定義block
        void(^myBlock)() = ^{
            m = 100; //加了__block前綴的變量,則可以在block內部修改
            NSLog(@"m = %d", m);
        myBlock();
        };
    }
    return 0;
}

四 block作為函數的返回值

//使用typedef定義一個新的類型

//1.給block起一個別名
typedef int (^newType)(int num1, int num2);

//2.使用新類型作為函數的返回值
newType test(){

    return ^(int x, int y){
        return x+y;
    };
//3.定義變量接受函數返回的值(block類型)
newType nt = test();
    NSLog(@"nt(45,23) = %d", nt(45,23));

//block作为方法的参数:
- (void)test:(void(^)(NSInteger Num))num;

五 block使用技巧和注意

1.block的快速提示:
輸入:inlineBlock得到如下提示

这里写图片描述

生成如下代碼
这里写图片描述

2.block變量用作方法的參數時
最好把參數類型列表部分加上 具體的形參名
这里写图片描述
直接寫代碼就可以了
这里写图片描述

總結

block是一個可以寫代碼塊的變量,類似于一個文件指針的東西,可以讓block變量來存儲一段代碼。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值