美文网首页
block类型

block类型

作者: Berning | 来源:发表于2021-05-06 15:04 被阅读0次

非ARC环境block类型

  • __NSGlobalBlock__ - 没有访问auto变量 (访问的是static ,global或者没有访问变量)
//非ARC
      void(^block)(void) = ^{
          NSLog(@"hello");
      };    //__NSGlobalBlock__
   
  • __NSStackBlock__ - 访问了auto变量
//非ARC
    int a = 10;
    
    void(^block)(void) = ^{
        NSLog(@"hello:%d",a);
    };  //__NSStackBlock__

  • __NSMallocBlock__ - __NSStackBlock__调用了copy__NSGlobalBlock__调用copy仍然是__NSGlobalBlock__
//非ARC
    int a = 10;
    void(^block)(void) = [^{
        NSLog(@"hello:%d",a);
    } copy];    //__NSMallocBlock__

ARC环境block

ARC环境下编译器会根据以下情况将栈区block复制到堆区

  • block作为返回值
  • 使用强指针(__strong)指向block
  • GCD函数中的block参数
  • cocoa API中使用的usingBlock方法参数

property属性

  • 非ARC
    @property(copy , nonatomic)void (^block)(void);

  • ARC
    @property(strong , nonatomic)void (^block)(void);
    @property(copy , nonatomic)void (^block)(void);

对象类型的auto变量

  • __NSStackBlock__无论是访问__strong还是__weak对象类型的auto变量,都不会强引用

  • __NSMallocBlock__访问__strong对象类型的auto变量,会强引用;
    访问__weak修饰的对象类型auto变量,不会强引用

  • block访问oc对象类型的auto变量会进行内存管理

static void __main_block_copy_0(struct __main_block_impl_0*dst, struct __main_block_impl_0*src) {_Block_object_assign((void*)&dst->p, (void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/);}

static void __main_block_dispose_0(struct __main_block_impl_0*src) {_Block_object_dispose((void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/);}

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};

相关文章

  • 9 Block详解

    1.明白如何定义block类型 定义Block类型: typedef 返回值类型 Block名字 参数 block...

  • iOS原理篇(五):Block探究

    Block原理 Block变量捕获 Block类型 copy操作和Block内部访问对象类型的变量 __block...

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

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

  • iOS 常见面试题 -- block

    一、block的本质 二、block的类型 block 有三种类型分别如下: 如何区分block的类型 三、blo...

  • iOS Block

    Block block 类型 block主要有三种类型 NSGlobalBlock:全局block,存储在全局区 ...

  • block的使用

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

  • Block类型和捕获变量

    Block类型 1:类型区别特征 Block是OC的对象,他也有类型,我在打印[block class]的时候可以...

  • Block实现原理

    主要介绍block的类型和底层分析 block类型 block主要由三种类型 NSGlobalBlock:全局bl...

  • Block

    Block的变量捕获(capture) Block的类型 如何区分Block的类型 MRC:Global:没有访问...

  • iOS底层:Block

    block的本质 block的变量捕获(capture) block的类型 block有3种类型,可以通过调用cl...

网友评论

      本文标题:block类型

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