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进阶面试题----Block部分

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

Block面试题解析

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。他在是一个仿对象,也可以说是一种特殊的对象,他有三种类型: 1.NSGlobal...
  • majiakun1
  • majiakun1
  • 2014年08月20日 10:46
  • 2915

iOS中block和delegate的区别(面试必问)

作为非常常见,且不出不在的block和delegate,理解它们,是我们掌握iOS开发必备知识点。 1.从源头上理解和区别block和delegate delegate运行成本低,block的运行...
  • u010670946
  • u010670946
  • 2017年05月07日 17:37
  • 801

Block面试题解析

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。他在是一个仿对象,...
  • xiong4662128
  • xiong4662128
  • 2014年08月02日 13:10
  • 793

inode与block面试题案例

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

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

iOS面试题系列: iOS如何面试 iOS基础面试题(一) iOS基础面试题(二) iOS基础面试题(三) iOS基础面试题(四) 1 什么是block 对于闭包(block),有...
  • hmxiao_1983
  • hmxiao_1983
  • 2014年01月24日 01:07
  • 598

大数据hadoop 面试经典题

1.在Hadoop中定义的主要公用InputFormat中,默认是哪一个?(A)   A、 TextInputFormat B、 KeyValueInputFormat C、 ...
  • haohaixingyun
  • haohaixingyun
  • 2016年10月14日 22:18
  • 8859

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

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

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

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

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

1 什么是block 对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的...
  • yick8799
  • yick8799
  • 2014年10月30日 20:39
  • 314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:block面试题
举报原因:
原因补充:

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