iOS block的基础语法
2018-07-05 本文已影响4人
奋拓达
Block的基本使用
Block概述
block是一个数据类型:int double float char ...
既然是一个数据类型,那么就可以声明这样的数据类型的变量,所以我们完全可以声明一个block类型的变量,
不同数据变量中可以存储不同的数据类型,那么block类型的变量中可以存储声明样的数据呢?
- Block是一个数据类型,所有我们可以声明一个block类型的变量
- Block类型的变量中专门存储1段代码,这段代码可以有参数 可以有返回值
- block的声明,虽然Block是用来存储一段代码的,但是一个block变量中并不是任意的1段代码都可以存进去的,有限定的,也就是说在声明block变量的时候保证这个block变量的代码段是否有参数,是否有返回值。一旦指定之后,这个block的变量中就只能存储这样的一段代码。
声明一个block变量,返回值是void 参数是有个int类型的,这时候,这个block变量中的就只能存储无返回值的且有一个int参数的代码段。 - 声明block变量的语法格式: 返回值类型 (^block变量名称)(参数列表);
- 无参数书写形式:void (^myblock)(void);
- 有参数的书写形式:int (^ myblock)(int num1 ,int num2);
block变量的基本使用
int sum(int a, int b){
return a + b;
}
void test(){
}
int main(int argc, const char * argv[]) {
sum(10, 20);
/**
* void 返回类型
* ^ caret 插入符号
* block1 变量名
* a, b 参数列表
*/
// block1 变量的定义
void (^block)(void) = ^void (void) {
NSLog(@"我是一个块代码");
};
void (^ block1)(void) = ^(void) {
NSLog(@"我是一个块代码");
};
// block调用
block();
block1();
int (^ sum)(int, int) = ^ (int a, int b) {
return a + b;
};
int result = sum(10, 20);
NSLog(@"result : %d", result);
return 0;
}
带参数的block变量类型的书写
int (^ myblock)(int num1 ,int num2) = ^ int(int num1,int num2) {
return num1 + num2;
};
int sum = myblock(10,20);
NSLog(@"sum=%d",sum);
使用block时需注意的问题
__block int a = 10;
NSLog(@"a 1: %p", &a);
void (^ block)(void) = ^(void) {
// 它被这个block拷贝成了一个常量
NSLog(@"a 2: %p", &a);
a = 10;
};
block();
block数据类型起别名
@interface ViewController ()
@end
typedef int (^ MyBlocks) (int a, int b);
@implementation ViewController
- (void)testBlock:(MyBlocks)block
{
block(10, 20);
}
- (void)viewDidLoad {
[super viewDidLoad];
MyBlocks block = ^(int a, int b) {
return a + b;
};
block(10, 20);
[self testBlock:^int(int a, int b) {
return a + b;
}];
}
Block的RetainCycle
当我们定义局部block时,它在内存中“栈”,它不会保留任何对象,因为它的生命周期出了方法就死亡了如果在块语句中,调用了一个局部变量,那么这个变量它会被认为是一个常量,是不可以被修改的,如果想修改,修饰符__block;全局、外部、静态变量.
一旦我们将block进行copy,意味着将这个block变量从栈拷贝到了堆中
a
.如果在块中是一个局部的对象,那么这个block变量会将这个对象进行保留,防止这个对象提前释放。如若不想保留,添加__block修饰符
b
.如果在块中是一个全局对象,那么这个block变量不会对这个对象进行保留,但会保留这个对象的拥有者,比如self