block内存操作之fowarding

来源:7-4 Block内存管理相关面试问题

鹤笑天

2020-03-31

图片描述

1.这题并没考察到是否对fowarding的理解啊?
老师,这道题,无论是这个block copy了或者是没copy,答案都是24啊
用copy修饰了,修改的堆上的,4* 6 24
没用copy修饰, 修改栈上的,也是 4* 6 24
怎么都不可能是4*10啊。

2.还有一个问题?
forwarding的意义是,copy修饰后,栈block或是堆block上访问都可以访问同一个__block变量!
但是copy修饰后,访问的不都是堆上的block么?
您例子中的那个不也是访问的堆上的block么?
怎么能再访问到栈上的block呢?

写回答

3回答

慕工程748436

2023-06-14

我的理解是,这个示例是要显示copy后两个block对象的结果相同,这表明两个block对象的捕获的对象的值(forwarding指向)是相同的。
如果我理解正确,那可能示例代码写成这样,表意会更清楚一点

__block int var = 10; int (^ testBlock) (int num) = ^int(int num){      return num*var; }; var = 6;

NSLog(@"block result is %d ", testBlock(5)); // 30说明var变成对象

var = 4;

_blk = testBlock; //copy操作后两个block的结果相同,说明两个block对象操作的var对象的forwarding相同

NSLog(@"block result is %d ", testBlock(5));

NSLog(@"block result is %d ", _blk(5));


0
0

于海

2020-04-03

可以再重看一遍这个小节。你给到的截图中示例代码是在说明forwarding 的理解的。 __block修饰的multiplier变量,你把那个__block修饰符去掉就会得到40的答案。可以亲自试下哦。

0
1
鹤笑天
老师这个问题我主要疑问的地方是: forwarding的意义是:(copy修饰后)访问栈block或是访问堆block都可以访问同一个值! 但是copy修饰后,我门使用的block不都是堆上的block么? 像截图中那样不也是访问的堆上的block么?既然我们都是访问的堆上的block,那其实也没必要有这个forwarding啊。 还是说copy之后,还是能调用到栈上的block(那如何调用到栈上的block呢?)
2020-04-03
共1条回复

于海

2020-04-03

可以再重看一遍这个小节。你给到的截图中示例代码是在说明forwarding 的理解的。 __block修饰的multiplier变量,你把那个__block修饰符去掉就会得到40的答案。可以亲自试下哦。

0
0

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程