block

作者: Li_Po | 来源:发表于2020-10-17 12:28 被阅读0次

什么是block:block是将函数及其上下文封装起来的对象
什么是block调用:block调用即是函数的调用

终端命令 clang -rewrite-objc fileName.m 生成 fileName.cpp
终端命令 clang -rewrite-objc -fobjc-arc fileName.m 生成 fileName.cpp 截取变量

一般情况下,对被截获变量进行赋值需要添加__block修饰符

为什么block会产生循环引用
block对当前对象进行截获会对当前对象强引用,而当前对象对block又有一个强引用,所以自循环。通过__weak来解除
__block MRC下不会 ARC下会循环引用,段环的方式来消除,但是如果该block一直没有调用,就不会释放

代码示例

image.png
int global_var = 4;
static int static_global_var = 5;
-- (void)method
{
  int var = 10;
__unsafe_unretained id unsafe_obj = nil;
__strong id strong_obj = nil;
int * static_var
static int multiplier = 6;

int(^Block)(int) = ^int(int num)
{
    NSLog(@"var %d",var);
    NSLog(@"unsafe_obj %@",unsafe_obj);
    NSLog(@"strong_obj %@",strong_obj);
    NSLog(@"multiplier %d",multiplier);
    //NSLog(@"static_var %d",static_var);
    NSLog(@"global_var %d",global_var);
    NSLog(@"static_global_var %d",static_global_var);
    return num * multiplier;
};
multiplier = 4;
NSLog(@"result is %d", Block(2));
 打印结果: //var 10// unsafe_obj (null)//strong_obj (null)//multiplier 4//global_var 4//static_global_var 5//result is 8

int i = 10;
static int m = 100;
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
void (^blk)(void) = ^{
NSLog(@"In block, i = %d", i);
NSLog(@"In block, m = %d", m);
    for (NSString *str in mArray) {
        NSLog(@"In block, str = %@", str);
    }
};
i = 20;
m = 200;
[mArray addObject:@"3"];
blk();
打印结果: //i = 10//m = 200//str = 1//str = 2//str = 3
}

一般情况下,对截获变量进行赋值操作需添加__block修饰符

赋值不等于使用,赋值需要,使用不需要!


image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

__forwarding存在的意义:不论在任何内存位置,都可以顺利访问同一个_block变量

循环引用

image.png
image.png

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:block

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