首页 > 其他 > 详细

【Objective_C学习笔记】Block的使用

时间:2015-11-30 20:20:29      阅读:235      评论:0      收藏:0      [点我收藏+]
  • Block的介绍
  1. 用于对象之间的通信,通信方式是1对1;
  2. 是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象;
  3. 可以把block当做Objective-C的匿名函数,block是OC中的一种数据类型,^是block的特有标记。
  • Block的格式
(返回类型)(^block名称)(参数类型)=^(参数列表){代码实现};。

  说明:如果没有参数,等号后面参数列表的()可以省略。

 

  • block 的使用
  1. block的定义
- (void)viewDidLoad {
    [super viewDidLoad];
    //1、无参数、无返回值的block的定义和使用
    void (^myBlock1)() = ^{
        NSLog(@"block无返回值,无参数");
    };
    myBlock1();
    
    //2、无参数、有返回值的block的定义和使用
    int (^myBlock2)() = ^{
        return 10;
    };
    NSLog(@"myBlock2的返回值是%d", myBlock2());
    
    //3、有参数,有返回值的block定义和使用
    int (^myBlock3)(int, int) = ^(int a, int b) {
        return a + b;
    };
    NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8));
    
}

  运行结果:

技术分享

    2.  block作为方法的参数

        将block作为方法的参数,可以用block来封装代码块。

- (void)viewDidLoad {
    [super viewDidLoad];
    //1、无参数、无返回值的block的定义和使用
    void (^myBlock1)() = ^{
        NSLog(@"block无返回值,无参数");
    };
    myBlock1();
    
    //2、无参数、有返回值的block的定义和使用
    int (^myBlock2)() = ^{
        return 10;
    };
    NSLog(@"myBlock2的返回值是%d", myBlock2());
    
    //3、有参数,有返回值的block定义和使用
    int (^myBlock3)(int, int) = ^(int a, int b) {
        return a + b;
    };
    NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8));
    
    //4、作为方法的参数,可以用block来封装代码块。
    [self testBlockAsParam:^{
        NSLog(@"block作为testBlockAsParam的参数");
    }];
}

- (void) testBlockAsParam: (void (^)()) block {
    block(); //执行block内部代码
}

 运行结果:

技术分享

 3.  Block作为属性

block作为属性,应使用copy修饰。若用weak、assign修饰block属性时,当block所在函数\方法返回\结束,该block就会被销毁。在其他方法内部调用访问该block,就会引发野指针错误EXC_BAD_ACCESS

技术分享
#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,copy) void (^myBlock)(); //block作为属性
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //1、无参数、无返回值的block的定义和使用
    void (^myBlock1)() = ^{
        NSLog(@"block无返回值,无参数");
    };
    myBlock1();
    
    //2、无参数、有返回值的block的定义和使用
    int (^myBlock2)() = ^{
        return 10;
    };
    NSLog(@"myBlock2的返回值是%d", myBlock2());
    
    //3、有参数,有返回值的block定义和使用
    int (^myBlock3)(int, int) = ^(int a, int b) {
        return a + b;
    };
    NSLog(@"myBlock3的返回值是%d", myBlock3(5, 8));
    
    //4、block作为方法的参数,可以用来封装代码块。
    [self testBlockAsParam:^{
        NSLog(@"block作为testBlockAsParam的参数");
    }];
    
    //5、block作为属性
    
    [self setMyBlock:^{
        NSLog(@"block作为属性");
    }];
    NSLog(@"%@",self.myBlock);
    self.myBlock();//block作为属性的调用
}

- (void) testBlockAsParam: (void (^)()) block {
    block(); //执行block内部代码
}
View Code

运行结果:

技术分享

【Objective_C学习笔记】Block的使用

原文:http://www.cnblogs.com/jxufelilu-blog/p/5008016.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!