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


相关文章推荐

inode与block面试题案例

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

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

iOS面试题系列: iOS如何面试 iOS基础面试题(一) iOS基础面试题(二) iOS基础面试题(三) iOS基础面试题(四) 1 什么是block 对于闭包(block),有...

C++ 归并排序算法的实现与改进(含笔试面试题)

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,即把待排序序列分为若干个子序列,每个子序列是有序...

海量数据处理:十道面试题与十个海量数据处理方法总结

海量数据处理:十道面试题与十个海量数据处理方法总结 作者:July、youwang、yanxionglu。 时间:二零一一年三月二十六日 本文之总结:教你如何迅速秒杀掉:99%的海量数据处理...

笔试面试题16--微信红包

题目: 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数 的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效...

java基础面试题汇总2(十题一章)

1.写clone()方法时,通常都会有一行代码,是什么?clone缺省行为:super.clone();因为首先要把父类中的成员先复制,然后再复制自己的成员2.java中的多态机制是什么?父类或者接口...

简单面试题::字符串按单词反转

字符串按单词反转 输入格式是:"this is a string" 输出格式是: "string a is this" 要求不能用任何库函数 这个题目看似非常简单,但是用纯C语言且...

BigData学习3_大数据技术Hadoop面试题_选择和判断

单项选择题 1. 下面哪个程序负责 HDFS 数据存储。 a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)task...

linux C/C++服务器后台开发面试题总结

一、编程语言 1.根据熟悉的语言,谈谈两种语言的区别? 主要浅谈下C/C++和PHP语言的区别: 1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多...

71道经典Android面试题和答案,重要知识点都包含了

,,面试题 1.        下列哪些语句关于内存回收的说明是正确的? (b ) A、 程序员必须创建一个线程来释放内存   B、内存回收程序负责释放无用内存    C、内存回收程序允许程序员...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:block面试题
举报原因:
原因补充:

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