Objective-C Blocks 小测验
2016-04-25 11:10
344 查看
http://ios.jobbole.com/84621/
今天看到一个有意思的 block 测试网站,记录一下。
你可以在这里来先测试一下:
Objective-C Blocks Quiz
Objective-C
解释:
这段代码在 MRC 和 ARC 的情况下都能正确执行。
因为
解释:
这段代码只有在 ARC 的情况下才能正确执行。
在 MRC 的情况下,block 分配在栈上,在
在 ARC 的情况下,block 将会被拷贝到堆中,可以合法使用。
Objective-C
解释:
这段代码在 MRC 和 ARC 的情况下都能正确执行。
因为
解释:
这段代码只有在 ARC 的情况下才能正确执行。
block 分配在栈上,如果是 ARC,将会被拷贝到堆上。而 MRC 的情况下,函数执行结束,这个地址就不存在了,而且编译器会报错:
这段代码只有在 ARC 的情况下才能正确执行。
和
如果不使用 ARC(我觉得现在应该没有不用 ARC 的吧…)需要在传递 block 的时候,使用
声明:本文内容并非原创,而是大部分引用自上面所说的网站
今天看到一个有意思的 block 测试网站,记录一下。
你可以在这里来先测试一下:
Objective-C Blocks Quiz
Example A
Objective-C123456 | void exampleA() { char a = 'A'; ^{ printf("%cn", a); }();} |
这段代码在 MRC 和 ARC 的情况下都能正确执行。
因为
exampleA的函数栈,在 block 执行完之前,并不会 pop,所以,无论函数中的 block 是在 stack 或是 heap 中,都能够被正确执行。
Example B
Objective-C1 2 3 4 5 6 7 8 9 10 11 12 13 | voidexampleB_addBlockToArray(NSMutableArray*array){ charb='B'; [array addObject:^{ printf("%cn",b); }]; } voidexampleB(){ NSMutableArray*array=[NSMutableArrayarray]; exampleB_addBlockToArray(array); void(^block)()=[array objectAtIndex:0]; block(); } |
这段代码只有在 ARC 的情况下才能正确执行。
在 MRC 的情况下,block 分配在栈上,在
exampleB_addBlockToArray返回之后,函数栈被弹出,这个 block 的地址就不再合法了。
在 ARC 的情况下,block 将会被拷贝到堆中,可以合法使用。
Example C
Objective-C123456789101112 | void exampleC_addBlockToArray(NSMutableArray *array) { [array addObject:^{ printf("Cn"); }];} void exampleC() { NSMutableArray *array = [NSMutableArray array]; exampleC_addBlockToArray(array); void (^block)() = [array objectAtIndex:0]; block();} |
这段代码在 MRC 和 ARC 的情况下都能正确执行。
因为
exampleC_addBlockToArray中的 block 并没有捕获任何变量,是一个
NSGlobalBlock,既不在堆中,也不在栈上,所以可以像普通的 C 函数一样访问,不会存在任何问题。
Exapmle D
Objective-C1 2 3 4 5 6 7 8 9 10 11 12 | typedefvoid(^dBlock)(); dBlockexampleD_getBlock(){ chard='D'; return^{ printf("%cn",d); }; } voidexampleD(){ exampleD_getBlock()(); } |
这段代码只有在 ARC 的情况下才能正确执行。
block 分配在栈上,如果是 ARC,将会被拷贝到堆上。而 MRC 的情况下,函数执行结束,这个地址就不存在了,而且编译器会报错:
error: returning block that lives on the local stack
Example E
typedef void (^eBlock)();
eBlock exampleE_getBlock() {
char e =
'E';
void (^block)() = ^{
printf("%cn", e);
};
return block;
}
void exampleE() {
eBlock block =
exampleE_getBlock();
block();
}
解释:
这段代码只有在 ARC 的情况下才能正确执行。和
Exapmle D的情况很类似,只不过这儿编译器在 MRC 情况下不会报错。
结论
ARC大法好!
如果不使用 ARC(我觉得现在应该没有不用 ARC 的吧…)需要在传递 block 的时候,使用
block = [[block copy] autorelease],这样可以让 block 拷贝到堆中。
声明:本文内容并非原创,而是大部分引用自上面所说的网站
相关文章推荐
- Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加
- 将JsonObject转换成HashMap
- django-mvvm(django的FormObject)
- json-lib使用,JSONObject和JSONArray
- Android属性动画(一):ValueAimator和ObjectAnimator的基本使用
- java中的object... args参数
- php之PDO (PHP DATA OBJECT)
- objective-c IOS应用更新
- 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
- iOS开发系列—Objective-C之Foundation框架
- json字符串转换为JSONObject和JSONArray .
- iOS开发系列--Objective-C之KVC、KVO
- Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object
- iOS开发系列--Objective-C之类和对象
- iOS开发系列—Objective-C之基础概览
- 浅谈Swift和Objective-C之间的那点事。。。
- 以下介绍的三种方法属于Object
- 用EL表达式获取List<Map<String,Object>>里面的值
- Delphi_09_Delphi_Object_Pascal_面向对象编程
- pip安装模块警告InsecurePlatformWarning: A true SSLContext object is not available.