Block
一、Block
block封装了一段代码,可以在任何时候执行
block可以作为函数的参数或者函数的返回值,而其本身又可以带输入参数或返回值
苹果官方建议尽量多用block.在多线程、异步任务、集合、动画转场用的很多
二、block要掌握的东西
1、如何定义block
int (^sumBlock)(int,int);
void (^printBlock)();
2、如何利用block封装代码
2.1第一种:
^(int a,int b){
return a+b;
};
2.2第二种
^(){
NSLog(@"===============");
};
2.3第三种(第二种的简写)
^{
NSLog(@"===============");
};
3、block如何访问外面变量
- ①block内部可以访问外部变量**
- ②默认情况下,block不能修改外面的局部变量
- ③给局部变量加上__block关键字,这个局部变量就可以在- -block内部修改
4、利用typedef定义block类型
typedef int (^MyBlock)(int,int);
以后就可以使用MyBlock这种类型来定义block变量了,如:
MyBlock block;
MYBlock b1,b2;
b1 = ^(int a,int b){
return a-b;
}
b2 = ^(int a,int b){
return a+b;
}
三、代码示例
// main.m
// 06_block
// Created by 杞文明 on 15/8/11.
// Copyright (c) 2015年 杞文明. All rights reserved.
//block的使用
#import <Foundation/Foundation.h>
typedef int (^SumBlock)(int,int,int);
int main(int argc, const char * argv[]) {
//block有返回值
int (^myblock)(int,int) = ^(int a,int b){
return a+b;
};
NSLog(@"sum_____%d",myblock(3,7));
//block木有返回值
void (^myprintBlock)() = ^{
NSLog(@"======我是霸气的小明=====");
};
myprintBlock();
int a = 10;
__block int b = 30;
void (^myblock2)() = ^{
//默认情况下我们的block是不能修改外面的局部变量的
//如果我们想要改变外面的局部变了的话,可以在外部局部变量申明时加上 __block
NSLog(@"现在是调用外边的局部变量:%d",a);
NSLog(@"现在调用的是修改值的外部变量,原来的值是:%d,现在的值是:%d",b,b=89);
};
myblock2();
SumBlock sum;
sum = ^(int a,int b,int c){
return a+b+c;
};
NSLog(@"这里我们使用的typedef定义的方式:%d",sum(5,6,7));
return 0;
}