block面试题
来源:互联网 发布:android编程语言 编辑:程序博客网 时间:2024/06/06 02:01
void testBlock()
{
int a =100;
// __block int a = 100;
NSLog(@"block定义前: %p", &a);//局部变量在栈区
//在定义block的时候,如果引用到外部变量,在block中,会对外部变量建立一个副本(copy)
void (^myBlock)() = ^{
// a = 90; //默认的情况下,block块中不允许修改外部变量的值。如果非要修改,外部变量定义前面加上修饰符__block
NSLog(@"%d", a );
NSLog(@"block定义中:%p", &a);//定义block后,a会在堆中建立一个副本
};
NSLog(@"block定义后:%p", &a);//栈区
a = 80;
myBlock();
}
输出Block里面的打印结果:
block定义前: 0x7fff5fbff82c
block定义后:0x7fff5fbff82c
block定义中:100
block定义中:0x100300020
根据打印结果可以知道:block是一组预先准备好的代码,在需要的时候(myBlock()调用的时候)才被执行。对于打印结果,为什么是100,直接看内存地址,就可以得到结果,block中的内存地址和外面的不是一块内存地址,因此也就无法改变block中的变量的值。
============================================================
void testBlock2()
{
__blockint a =100;
NSLog(@"block定义前: %p", &a);//局部变量在栈区
void (^myBlock)() = ^{
NSLog(@"block定义中:%d", a );
NSLog(@"block定义中:%p", &a);//定义block后,a会在堆中建立一个副本
};
NSLog(@"block定义后:%p", &a);//定义block后,a会在堆中建立一个副本
a = 80;
myBlock();
}
Block[13195:1241198] block定义前: 0x7fff5fbff828
Block[13195:1241198] block定义后:0x100400048
Block[13195:1241198] block定义中:80
Block[13195:1241198] block定义中:0x100400048
根据地址可以看到,为什么__block 修饰的变量可以在block中可以被修改地址了吧。
==========================
void testBlock3()
{
NSMutableString *str = [NSMutableStringstringWithString:@"jdk"];
NSLog(@"指向堆中字符串的地址:%p栈区变量的地址:%p", str, &str);
void (^myBlock)() = ^{
[str setString:@"LISA"];
NSLog(@"m: %p %p %@", str, &str, str);
};
NSLog(@"af: %p %p", str, &str);
myBlock();
}
Block[13330:1263164] 指向堆中字符串的地址:0x100106670栈区变量的地址:0x7fff5fbff828
2015-07-08 21:48:56.188 Block[13330:1263164] af: 0x100106670 0x7fff5fbff828
2015-07-08 21:48:56.188 Block[13330:1263164] m: 0x100106670 0x100200160 LISA
- Block面试题解析
- Block面试题解析
- block面试题
- iOS面试题总结---block
- iOS进阶面试题----Block部分
- iOS进阶面试题----Block部分
- iOS进阶面试题-----Block部分
- iOS进阶面试题----Block部分
- iOS进阶面试题----Block部分
- iOS进阶面试题----Block部分
- 一个block的面试题(刀哥)
- iOS进阶面试题----Block部分
- iOS 进阶面试题-Block部分
- inode与block面试题案例
- Ios 关于Block循环引用的面试题
- iOS开发---block面试题总结(一)
- 学习笔记13——.关于inode和block的两道企业面试题
- iOS面试题(2.)关于在block中使用weakSelf的讨论
- 复杂对象的组装与创建——建造者模式
- 查看LINUX操作系统及位数
- 单例模式
- 【GLSL教程】(二)在OpenGL中使用GLSL
- 463 九九乘法表
- block面试题
- 深度学习(三)theano入门学习
- LeetCode Repeated DNA Sequences
- window下rocketmq启动报Load JVM error
- 实时显示iOS编写UI代码效果
- NGINX介绍及参数
- 无边框手机为什么很难实现
- Linux下tar.xz结尾的文件的解压方法
- Java tutorial 1