【block第四篇】实现

本文深入探讨Block的实现原理,包括Block的定义、捕获变量、存储区域以及__block修饰符的使用。通过实例分析Block在栈、全局、堆上的存储情况,并解释Block如何捕获和修改变量。同时,文章解答了相关测试题目,帮助读者理解Block的工作机制。

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

-------------------------------------------欢迎查看block连载博客【专栏】--------------------------------------
【block编程第一篇】block语法                   【block编程第二篇】block捕获变量和对象;
【block编程第三篇】block的内存管理。     【block编程第四篇】block内部实现(当前)
【block编程第五篇】block中如何避免循环引用
----------------------------------------------------------------------------------------------------

一、先看几道block相关的题目

        这是一篇比较长的博文,前部分是block的测试题目,中间是block的语法、特性,block讲解block内部实现和block存储位置,请读者耐心阅读。具备block基础的同学,直接调转到block的实现。

        下面列出了五道题,看看能否答对两三个。主要涉及block栈上、还是堆上、怎么捕获变量。答案在博文最后一行

 

//-----------第一道题:--------------
void exampleA() {
  char a = 'A';
  ^{ printf("%c\n", a);};
}
A.始终能够正常运行          B.只有在使用ARC的情况下才能正常运行
C.不使用ARC才能正常运行     D.永远无法正常运行
//-----------第二道题:选项同第一题--------------
void exampleB_addBlockToArray(NSMutableArray *array) {
  char b = 'B';
  [array addObject:^{printf("%c\n", b);}];
} 
void exampleB() {
  NSMutableArray *array = [NSMutableArray array];
  exampleB_addBlockToArray(array);
  void (^block)() = [array objectAtIndex:0];
  block();
}
//-----------第三道题:选项同第一题--------------
void exampleC_addBlockToArray(NSMutableArray *array) {
  [array addObject:^{printf("C\n");}];
} 
void exampleC() {
  NSMutableArray *array = [NSMutableArray array];
  exampleC_addBlockToArray(array);
  void (^block)() = [array objectAtIndex:0];
  block();
}
//-----------第四道题:选项同第一题--------------
typedef void (^dBlock)(); 
dBlock exampleD_getBlock() {
  char d = 'D';
  return ^{printf("%c\n", d);};
}
void exampleD() {
  exampleD_getBlock()();
}
//-----------第五道题:选项同第一题--------------
typedef void (^eBlock)(); 
eBlock exampleE_getBlock() {
  char e = 'E';
  void (^block)() = ^{printf("%c\n", e);};
  return block;
}
void exampleE() {
  eBlock block = exampleE_getBlock();
  block();
}

 

【注】:以上题目摘自:CocoaChina论坛

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值