您的位置:首页 > 移动开发 > IOS开发

block

2015-03-01 17:48 351 查看

block

什么是block

block的简单应用

block的适用范围

block的注意事项

1.什么是blcok

block就是弥补了 指向函数的指针 不能够直接保存一个函数体(代码块)

2.blcok的简单应用

(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));


3.block的适用范围

1、block可以用于页面之间传值

2、block可以用于简化代码,增加代码的重用性

4.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:^{

}];
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  block iOS 循环引用