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

2018-12-28  本文已影响6人  xxxxxxxxx_ios

1.Block的值捕获Capture

值捕获
#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

2.Block类型

3.Block的copy操作

#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]));
    }
}
#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]));
    }
}

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, ^{
});
上一篇下一篇

猜你喜欢

热点阅读