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
复制代码

 

posted @   ZhangShengjie  阅读(610)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示