__block原理

__block原理分析

前言

block的使用通常須要注意如下幾個細節:c++

  • block捕獲外部變量
  • block內部對外部變量的修改
  • block循環引用

一.block對外部變量的捕獲

NSObject *obj = [[NSObject alloc] init];
    int age = 10;
    
    void(^block)(void) = ^{
        NSLog(@"block -- %d",age);
        NSLog(@"obj-class -- %@",[obj class]);
    };
    block();
複製代碼

如下是對局部變量obj對象和age(int)的捕獲,ARC下block內部持有外部變量會自動進行copy操做spa

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  int age;
  NSObject *__strong obj;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _age, NSObject *__strong _obj, int flags=0) : age(_age), obj(_obj) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  int age = __cself->age; // bound by copy
  NSObject *__strong obj = __cself->obj; // bound by copy
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_ls_y2bpmhkn2ljfgjl8ylw94ls40000gn_T_main_7248b8_mi_0,age);
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_ls_y2bpmhkn2ljfgjl8ylw94ls40000gn_T_main_7248b8_mi_1,((Class (*)(id, SEL))(void *)objc_msgSend)((id)obj, sel_registerName("class")));
};
複製代碼
相關文章
相關標籤/搜索