美文网首页
__block修饰符

__block修饰符

作者: it小小菜鸟 | 来源:发表于2020-07-17 18:39 被阅读0次
1. __block可以用于解决block内部无法修改auto变量值的问题
2. __block不能修饰全局变量、静态变量(static)
3. __block修饰变量时,编译器会把该变量包装成一个对象
// OC代码
__block int age = 10;
__block NSObject *obj = [[NSObject alloc] init];
void (^block1)(void) = ^{
   age = 20;
   obj = nil;
   NSLog(@"block a = %d",age);
};

//修饰基本数据类型,外部变量用__block修饰之后的结构体
struct __Block_byref_age_0 {
  void *__isa;
__Block_byref_age_0 *__forwarding;
 int __flags;
 int __size;
 int age;
};
// 修饰类
struct __Block_byref_obj_1 {
  void *__isa;
__Block_byref_obj_1 *__forwarding;
 int __flags;
 int __size;
 void (*__Block_byref_id_object_copy)(void*, void*);
 void (*__Block_byref_id_object_dispose)(void*);
 NSObject *__strong obj;
};

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
  void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);
  void (*dispose)(struct __main_block_impl_0*);
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0, __main_block_dispose_0};

// 捕获__block修饰的外部变量之后的 Block结构体
struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  __Block_byref_age_0 *age; // by ref
  __Block_byref_obj_1 *obj; // by ref
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_age_0 *_age, __Block_byref_obj_1 *_obj, int flags=0) : age(_age->__forwarding), obj(_obj->__forwarding) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

相关文章

  • iOS面试之Block大全

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

  • iOS面试之Block模块

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

  • 2022-04-13 block笔记

    什么是block 什么是block调用 block截获变量 __block修饰符用在什么场景,__block变量_...

  • Block

    Block介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 一、Block介绍 1...

  • IOS_Block_定义

    [TOC] Declare c语言中方法修饰符 ( ) ,如定义一个方法: block指针修饰符^block指针修...

  • block:__block修饰符和__block变量

    一、block执行体里无法修改外界的普通局部变量,可以用__block修饰符修饰一下二、__block修饰符的底层...

  • iOS 面试全方位剖析 -- Block篇

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS-Block知识点整理

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS 关于block前缀的理解

    关于block:修饰符 用copy(要从堆区 拷贝到栈区) 前缀修饰符: __block:默认情况下,bloc...

  • iOS-底层原理(10)-block-__block属性详解

    __block修饰符 __block可以用于解决block内部无法修改auto变量值的问题 __block不能修饰...

网友评论

      本文标题:__block修饰符

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