iOS block的变量捕获(capture)

Posted ZhangShengjie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于iOS block的变量捕获(capture)的主要内容,如果未能解决你的问题,请参考以下文章

深入研究Block捕获外部变量和__block实现原理

深入研究Block捕获外部变量和__block实现原理

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

Block对象变量捕获(三)

iOS 中Block的理解以及啥时候会引起循环引用

Smarty内置函数之capture