美文网首页
block对变量的捕获

block对变量的捕获

作者: _清墨 | 来源:发表于2019-04-11 15:54 被阅读0次
1:可以捕获不可以修改变量

局部变量

2:可以捕获且可以修改变量

全局变量
静态变量
__block修饰的局部变量

下面我们看个例子,大家根据例子输出结果来思考加深理解。
.h

#import <UIKit/UIKit.h>

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@end


typedef void(^PersonBlock)(Person *);

@interface ViewController : UIViewController

@property (nonatomic, copy) PersonBlock myBlcok;

@end

.m

#import "ViewController.h"

@implementation Person

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self testBlock];
}


-(void)testBlock{
    Person *p1 = [[Person alloc]init];
    p1.name = @"p1";
    
    Person *p2 = [[Person alloc]init];
    p2.name = @"p2";
    
    Person *p3 = [[Person alloc]init];
    p3.name = @"p3";
    
    NSArray *arr = @[p1,p2,p3];
    
    for (Person *p in arr) {
        
        int i=2;
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"没传参数时%@",p.name);
            NSLog(@"%d",i);
        });
        i=4;
        
        _myBlcok = ^(Person *p){
            NSLog(@"传递参数时%@",p.name);
        };
        _myBlcok(p);
        
        p.name = @"p-new";
    }
    
    
    void (^Block)(int) = ^(int i){
        NSLog(@"值是%d",i*2);
    };
    int a = 4;
    Block(a);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"主线程调用最后值是%d",a*2);
    });
    a = 6;
    
    
}


@end

结果:

2019-04-11 15:51:11.475200+0800 Block[63860:3183459] 传递参数时p1
2019-04-11 15:51:11.475373+0800 Block[63860:3183459] 传递参数时p2
2019-04-11 15:51:11.475499+0800 Block[63860:3183459] 传递参数时p3
2019-04-11 15:51:11.475609+0800 Block[63860:3183459] 值是8
2019-04-11 15:51:11.481302+0800 Block[63860:3183459] 没传参数时p-new
2019-04-11 15:51:11.481674+0800 Block[63860:3183459] 2
2019-04-11 15:51:11.481816+0800 Block[63860:3183459] 没传参数时p-new
2019-04-11 15:51:11.481919+0800 Block[63860:3183459] 2
2019-04-11 15:51:11.482052+0800 Block[63860:3183459] 没传参数时p-new
2019-04-11 15:51:11.482152+0800 Block[63860:3183459] 2
2019-04-11 15:51:11.482262+0800 Block[63860:3183459] 主线程调用最后值是8

相关文章

  • block:block捕获变量

    一、block捕获变量根儿上的东西 1、block会捕获局部变量 2、block不会捕获全局变量二、block捕获...

  • Block变量捕获详解(一)

    什么是Block变量捕获block变量捕获就是在block内部创建一个变量来存放外部变量什么是值捕获block将外...

  • Block 第三次学习 感谢 MJ老师

    block 内部结构 Block block 变量捕获 变量类型捕获到block 内部访问方式局部变量auto(平...

  • OC基础-Block(2)

    OC基础-Block(2)Block的变量捕获为了保证block内部能够正常访问外部的变量,block有个变量捕获...

  • OC中的Block(二)

    block的变量捕获(capture) 为了保证block内部能够正常访问外部的变量,block有个变量捕获机制 ...

  • block变量的捕获(capture)

    ?为了保证block内部能够正常访问外部变量,block有个变量捕获机制 auto变量的捕获

  • Objective - C block(二)block的类型及捕

    (一)block 捕获变量类型 为了保证block内部能够正确访问外部的变量,block有一个变量捕获机制 (1)...

  • iOS-Block变量捕获

    block对变量的捕获 1:可以捕获不可以修改变量 局部变量 2:可以捕获且可以修改变量 全局变量 静态变量 __...

  • 06.4-OC中block捕获对象类型的变量

    block捕获对象类型的变量 前面讲解的block变量捕获,我们讲解了block捕获基本数据类型的情况,下面我们再...

  • Objective-C Block深入源码

    1. Block捕获自动变量 如何捕获自动变量? Block转换为C函数之后,Block中使用的自动变量会被作为成...

网友评论

      本文标题:block对变量的捕获

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