iOS学习笔记iOS学习开发iOS进阶指南

Block补充

2016-04-07  本文已影响90人  MarceauHe

block声明/定义

// 声明:返回值(^block变量名)(参数)
    void(^block)();
   // 定义
    // 方式一:
    void(^block1)() = ^(){
        NSLog(@"调用block1");
    };

    // 调用Block,就会去查看下Block保存代码
    block1();

    // 方式二:block如果没有参数,可以省略()
    // void(^)()
    void(^block2)() = ^{

    };

    // 方式三:block定义中,返回值可以省略
    // 类型:int(^)()
    int(^block3)() = ^int{

        return 2;
    };

添加block属性

// Block怎么声明.就怎么定义属性
// block:属性名
@property (nonatomic ,strong) void(^block)();

block内存管理(非ARC)

block内存管理(非ARC)

block循环引用

- (void)viewDidLoad {
    [super viewDidLoad];
    int a = 0;

    // Block循环引用,跟block调用没有关系
    // block只要访问外部强指针对象变量,就会对这个变量进行强引用.
    __weak typeof(self) weakSelf = self;

    _block = ^{

        __strong typeof(weakSelf) strongSelf = weakSelf;

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"延迟打印%@",strongSelf);

        });

    };

    _block();
}

set方法内存管理

- (void)setRoom:(Room *)room
{
    // 避免过度释放
    if (room != _room)
    {
        // 对当前正在使用的房间(旧房间)做一次release
        [_room release];

        // 对新房间做一次retain操作
         _room = [room retain];
    }
}

block变量传递

//打印结果为5:值传递
- (void)viewDidLoad {
    [super viewDidLoad];
    int a = 5;

    void(^block)() = ^{
        NSLog(@"%d",a);
    };
    a = 10;
    block();
}
//打印结果为10:指针传递
- (void)viewDidLoad {
    [super viewDidLoad];

    static int a = 5;

    void(^block)() = ^{
        NSLog(@"%d",a);
    };
    a = 10;
    block();
}
//打印结果为10:指针传递
- (void)viewDidLoad {
    [super viewDidLoad];

    __block int a = 5;

    void(^block)() = ^{
        NSLog(@"%d",a);
    };
    a = 10;
    block();
}
//打印结果为10,指针传递
static int a = 5;
- (void)viewDidLoad {
    [super viewDidLoad];

    void(^block)() = ^{
        NSLog(@"%d",a);
    };
    a = 10;
    block();
}

block当做参数去使用

//控制器当中的代码
- (void)viewDidLoad {
    [super viewDidLoad];

    //创建一个计算器管理者
    CalculateManager *manager = [[CalculateManager alloc] init];
    [manager calculateManager:^(int result){
        result = result + 5;
        result = result * 5;
        return result;
    }];
    NSLog(@"%d",manager.result);

}
//计算机管理者类当中提供的方法,_result为管理者的属性
-(void)calculateManager:(int(^)(int))block
{
    //相当于执行
//    ^(_result){
//        result = result + 5;
//        result = result * 5;
//        return result;
//    }
    _result = block(_result);
}

block当做参数返回

- (void)viewDidLoad {
    CalculateManager *manager = [[CalculateManager alloc] init];
    //让计算器不断的累加
    manager.add(5).add(5).add(5).add(5);
    NSLog(@"%zd",manager.result);
}

-(CalculateManager *(^)(NSInteger))add
{
    return ^(NSInteger value){

        _result += value;
        return self;
    };
}

上一篇 下一篇

猜你喜欢

热点阅读