美文网首页
【block第一篇】block值捕获与类型

【block第一篇】block值捕获与类型

作者: xxxxxxxxx_ios | 来源:发表于2018-12-28 09:32 被阅读6次

1.Block的值捕获Capture

值捕获
  • 说明
    对于block中使用的auto变量(一般的局部变量),block是值传递,对于static修饰的变量,是指针传递,对于全局变量是直接访问
  • 代码
#import "ViewController.h"

@interface ViewController ()
{
    int _c;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    int a = 10;
    void(^block1)(void) = ^{
      
        NSLog(@"a = %d",a);
    };
    a = 20;
    block1();
    
    static int b = 10;
    void(^block2)(void) = ^{
        
        NSLog(@"b = %d",b);
    };
    b = 20;
    block2();
    
    _c = 10;
    void(^block3)(void) = ^{
        
        NSLog(@"c = %d",self->_c);
    };
    _c = 20;
    block3();
}
@end
  • 运行结果


    Capture运行结果

2.Block类型

  • block的三种类型


    block类型
  • 每一种类型的block调用copy后的结果


    block调用copy

3.Block的copy操作

  • 在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上.
    1. block作为函数返回值时
  • 代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"


typedef void(^YMBlock)(void);

YMBlock getBlock() {
    
    int a = 10;
    return ^ {
        NSLog(@"a = %d",a);
    };
}

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        YMBlock block = getBlock();
        NSLog(@"%@",[block class]);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 运行结果
    block作为函数返回值
    2. 将block赋值给__strong指针时
  • 代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"


typedef void(^YMBlock)(void);


int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        /// 有__strong指针指向
        int a = 10;
        YMBlock block = ^ {
            NSLog(@"%d",a);
        };
        NSLog(@"%@",[block class]);
        
        // 无__strong指针指向
        NSLog(@"%@",[^ {
            NSLog(@"%d",a);
        } class]);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 运行结果


    有无__strong指针指向

3. block作为Cocoa API中方法名含有usingBlock的方法参数时
block作为GCD API的方法参数时

NSArray *arr = @[];
[arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
    }];
    
dispatch_queue_t queue = dispatch_get_main_queue(); 
dispatch_async(queue, ^{
});

相关文章

网友评论

      本文标题:【block第一篇】block值捕获与类型

      本文链接:https://www.haomeiwen.com/subject/yuudlqtx.html