-------------------------------------------欢迎查看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论坛