block面试题

原创 2015年07月08日 18:42:32

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 = [NSMutableString stringWithString:@"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


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

ios面试题 多线程

1 多线程是什么  多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都...

iOS面试 block

1 什么是block 对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Block面试题解析

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。他在是一个仿对象,

iOS开发---block面试题总结(一)

block面试题 1 什么是block? block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。与代理协议的...

iOS进阶面试题----Block部分

1 什么是block 对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的程序m...
  • xunyn
  • xunyn
  • 2013-09-17 11:00
  • 66645

inode与block面试题案例

1题:如果想磁盘写入数据提示如下错误: No space left on device。 通过df -h查看磁盘空间,发现没满,请问可能原因是什么?解答:可能是inode数量被消耗尽了。 df ...

iOS进阶面试题----Block部分

1 什么是block 对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的...

[面试时]我是如何讲清楚Block的

1、概述blocks是OS X Snow Leopard和iOS4引入的C语言扩充语法,其优点在于代码简洁而且集中,而且还可以写匿名函数!2、Blocks 模式2.1、语法2.1.1完整版本^ ( 返...

iOS之block浅谈

前言 ios4.0系统已开始支持block,在编程过程中,block被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带...
  • czkyes
  • czkyes
  • 2016-05-26 15:41
  • 3538

OC面试中,Block常出现的三个问题

1、输出的值是多少?为神么?//提问,输出的值是多少 // 在定义Block的时候,如果应用了外部变量的值,会对外部变量做一个copy,把栈区的变量,拷贝到堆区 // 如果后续再改变变量的...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)