block就是弥补了 指向函数的指针 不能够直接保存一个函数体(代码块)
(1)无参数无返回值的block
// 定义一个没有参数没有返回值的block
void (^block)(void) = ^{
NSLog(@"My name is block");
};
// block的调用
block();
(2)有参数无返回值的block
// 定义一个有参数没有返回值的block
void (^block)(int) = ^(int num) {
NSLog(@"我今年%d岁了", num);
};
// block的括号中可以填入参数
block(20);
(3)无参数有返回值的block
// 定义一个无参数有返回值的block
int (^block)() = ^{
return 10;
};
// 打印这个block的值
NSLog(@"%d", block());
(4)有参数有返回值的block
// 定义一个有参数有返回值的block
int (^block)(int, int) = ^(int a, int b) {
return a + b;
};
// 打印这个block的值
NSLog(@"%d", block(3, 4));
1、block可以用于页面之间传值
2、block可以用于简化代码,增加代码的重用性
1、在使用block作为属性时,要把其内存特性设为copy
2、在使用block修改block外部的局部变量时,要在该局部变量前加__block关键字(如下代码1)
3、在使用block中如果想调用self关键字时,要对该用一个__weak指针指向self,再在block中调用__weak指针,避免循环引用(如下代码2)
代码1
// 如果想要改变,block代码块之外的变量值,就必须在变量前加入
// __block关键字
__block int x = 0;
int (^sumBlock)(int a, int b) = ^int (int a, int b) {
int result = (a * b);
x = result;
return result;
};
sumBlock(1, 2);
NSLog(@"%d", x);
代码2
// __weak关键字修饰的指针指向self
__weak ViewController *view = self;
void (^block)() = ^{
// 在block中使用被__weak关键字修饰过的指针,可以避免循环引用
// 因为block会将其内部的对象变成强引用,会出现循环引用的状态
[view presentViewController:view1 animated:YES completion:^{
}];
};
原文地址:http://blog.csdn.net/aptx84869/article/details/44003763