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
  • 相关阅读:
    C/C++定义全局变量/常量几种方法的区别
    可变参数宏__VA_ARGS__
    mysql 命令重命名表RENAME TABLE 句法
    贝尔实验室的历史
    SVN代码回滚
    linux下查看进程占用端口和端口占用进程命令
    php操作mongodb中的ISODate格式日期
    Vim多行缩进技巧
    关于XCode工程中PrefixHead.pch文件的使用
    Object C函数指针@selector
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/12319422.html
Copyright © 2011-2022 走看看