美文网首页
关于 __ block 再理解

关于 __ block 再理解

作者: 帽子和五朵玫瑰 | 来源:发表于2018-07-10 10:21 被阅读0次

关于 __ block 再理解

我们都知道:block不准修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__ block所起到的作用就是只要观察到该变量被block所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值

block不允许修改外部变量的值,apple这样设计,应该是考虑到了block的特殊性,block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域。在几个作用域之间进行切换时,如果不加上这样的限制,变量的可维护性将大大降低。

NSString 为什么必须用 __ block

@property (nonatomic, copy) NSString *testStr;

NSString *test1 = [[NSString alloc] initWithString:@"123"];
NSString *test2 = @"123";
NSString *test3 = [NSString stringWithFormat:@"123"];
NSMutableString *test4 = [[NSMutableString alloc] initWithString:@"123"];
NSString *test5 = [test4 copy];
NSString *test6 = [NSString stringWithFormat:@"%@", @"123"];
self.testStr = [test2 copy];

MyTestProject[19849:666990] 0x10bc0cf50  0x10bc0cf50  0xa000000003332313  
0x608000268800  0xa000000003332313  0xa000000003332313  0x10bc0cf50

下面简单解释下:

self.testStr只是对test2的一个浅拷贝,自然地址和2一样;

3,5,6的类型都是NSTaggedPointerString,4的类型是__NSCFString。3,5,6的字面量虽然和1、2一样的,但是类型其实是不同的。

上面打印的结果中可以看到3,5,6的地址位置非常高,那它们分配在哪个区呢?

** 另外需要注意的是:如果换成较长的字符串,3,5,6的类型也不是NSTaggedPointerString而是__NSCFString **

NSString *str =[[NSString alloc]initWithString:@"4321"]; 通过alloc分配内存空间,这个时候空间是分配到堆上的。 str = @"123"; 这个时候是一个字符串常量,存储空间在栈上。 在堆上的空间需要程序员自己管理(也就是需要自己去申请alloc,和自己去释放release) 在栈上的空间是自动分配和回收的

相关文章

  • 关于 __ block 再理解

    关于 __ block 再理解 我们都知道:block不准修改外部变量的值,这里所说的外部变量的值,指的是栈中指针...

  • 九、Block之(一)Block内部结构及调用本质

    一、Block内部数据结构 1.调用分析 2.关于block调用中 block->FunPrt()的理解 bloc...

  • 关于block的理解

    FBI WARNING:纯属个人见解,有可能是错误的理解。O(∩_∩)Oblock作用1.可以传递数据,取代代理模...

  • 关于block的理解

    block的类型详解 关于block的知识,在网络上的资料那是相当的多。不过这里还是想来谈谈自己对block的理解...

  • 关于Block的理解

    Block是将函数及其执行上下文封装起来的对象。在开发过程中我们经常会用到Block处理一些事物,下面我们就对Bl...

  • 关于Block再啰嗦几句

    1.一共有6种类型: BLOCK_EXPORTvoid*_NSConcreteStackBlock[32]; //...

  • Block原理探究(上篇)-Block本质及存储域问题

    主要内容:1.理解Block的本质2.理解Block的存储域分类3.理解Block的Copy原理 一、探究Bloc...

  • Block

    将我认为的比较易懂的关于block的文章整理到一起: 文章链接: 你真的理解__block修饰符的原理么? __b...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

网友评论

      本文标题:关于 __ block 再理解

      本文链接:https://www.haomeiwen.com/subject/fqoxpftx.html