OC面试题 - block相关汇总

本文详述了Objective-C中Block的基础使用、原理、捕获机制,以及__block和__weak的区别,重点讨论了如何避免Block导致的循环引用问题,并介绍了不同类型的Block的区别。通过阅读,你可以深化对Block的理解及其在iOS开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

block出现之后除了官方原有,几乎很少人再用delegate模式了,很多api也扩展了block模式,block最常见的面试分为:

1.block的基本使用方式

一般来说block都是在回调里面的

void (^block)(int) = ^(int a)
{
   NSLog(@"%d",a);
};
block(3);

不过实际开发要复杂的多了,block(3);一般是另一个类来调用,而block本身也会作为一个参数来传递,使用方式和swift的闭包基本一毛一样,不过原理来说根本就不是一回事了

2.block的原理,本质上block是个啥

block本质就是个类,因为它继承自OC对象,说白了就是一个类里面有个函数,只是因为外面进行了封装,搞不清这是个啥,因为会捕获外面的属性/变量等等,所以会导致循环引用

大概内存结构就是存储了isa和一个__block_impl类(里面有isa 和实际的block函数和一些系统内部的变量,)和一些捕获的变量,如上图所示,age就是捕获的值FuncPtr就是实际的函数

所以其实 这个block不是block类的包本身而是,而且__block_impl这个类,而block(3)这段函数就是

block->FuncPtr(3);这就是Block基本的运行原理

3.block捕获机制

int b = 10;
void (^block)(int) = ^(int a)
{
   NSLog(@"%d,%d",a,b);
};
block(3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值