请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

block内存操作之fowarding

图片描述

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

3回答

慕工程748436 2023-06-14 18:26:48

我的理解是,这个示例是要显示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 回复 有任何疑惑可以回复我~
于海 2020-04-03 14:17:38

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

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

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信