zoukankan      html  css  js  c++  java
  • iOS block的变量捕获(capture)

    变量捕获会在blcok结构体内部生成一个变量已来存储捕获到的指针或者值

    #import "Person.h"
    
    @implementation Person
    /*
     oc每个函数后面都自带 (Person * self, SEL _cmd)
     -(void)test:(Person * self, SEL _cmd);
     而入参都是局部变量 所以下面代码会捕获 self 
     */
    -(void)test{
        void (^bblock)(void)=^{
            NSLog(@"%@",self);
        };
        bblock();
    }
    /*
     struct __Person__test_block_impl_0 {
       struct __block_impl impl;
       struct __Person__test_block_desc_0* Desc;
       Person *self;
       __Person__test_block_impl_0(void *fp, struct __Person__test_block_desc_0 *desc, Person *_self, int flags=0) : self(_self) {
         impl.isa = &_NSConcreteStackBlock;
         impl.Flags = flags;
         impl.FuncPtr = fp;
         Desc = desc;
       }
     };
     
     static struct __Person__test_block_desc_0 {
       size_t reserved;
       size_t Block_size;
       void (*copy)(struct __Person__test_block_impl_0*, struct __Person__test_block_impl_0*);
       void (*dispose)(struct __Person__test_block_impl_0*);
     } __Person__test_block_desc_0_DATA = { 0, sizeof(struct __Person__test_block_impl_0), __Person__test_block_copy_0, __Person__test_block_dispose_0};
    
     static void _I_Person_test(Person * self, SEL _cmd) {
         void (*bblock)(void)=((void (*)())&__Person__test_block_impl_0((void *)__Person__test_block_func_0, &__Person__test_block_desc_0_DATA, self, 570425344));
         ((void (*)(__block_impl *))((__block_impl *)bblock)->FuncPtr)((__block_impl *)bblock);
     }
     
     */
    @end
  • 相关阅读:
    表达式执行工具方法
    Mysql表创建外键报错
    JVM打印加载类的详情信息
    Shell脚本查询进程存活信息
    旋转数组的最小数字
    斐波那契数列(水题)
    用两个栈实现队列
    变态跳台阶
    跳台阶
    9*9乘法表(5种输出格式)
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/12319422.html
Copyright © 2011-2022 走看看