美文网首页
OC堆和栈存储内容的区别

OC堆和栈存储内容的区别

作者: 70岁了还要浪 | 来源:发表于2017-06-12 22:54 被阅读227次

举例:对象存储在堆,而block存储在栈。
创建一个对象:

NSObject *obj = [[NSObject alloc] init];  

这行代码创建了一个obj对象,指针obj存储在栈,obj指向的对象存储在堆,目前 Objective-C 并不支持直接在栈上创建对象,但可以通过如下方式间接地创建:

struct {
Class isa;
} fakeNSObject;
fakeNSObject.isa = [NSObject class];

NSObject *obj = (NSObject *)&fakeNSObject;
NSLog(@"%@", [obj description]);

一 . 为什么对象存在堆里,而不是存在栈,栈的读写速度快且内存管理方便,不会造成内存泄漏,而堆相对来来说就慢很多。

原因:
1.Objective-C 变量有效范围是由 “{}” 包含的块来决定的,也就是说栈对象的生命周期仅限于其所在的块里,出了块立马会被释放。一个对象被创建以后有可能会通过方法调用传递到别的方法,当栈对象的创建方法返回时,栈对象会被一起 pop 出栈而释放,导致其没法在别处被继续持有。此时 retain 操作会失效,除非用 copy 方法在想持有该栈对象的地方重新拷贝一份属于自己的栈对象。
因此,栈对象回给对象的内存管理造成相当大的麻烦。

2.现代操作系统的栈和线程绑定,而栈空间是有限的,具体如下:

512 KB (secondary threads)
8 MB (OS X main thread)
1 MB (iOS main thread)

因此对象如果都在栈上创建不太现实,而堆只要物理内存不告警可以无限制使用。
综合以上优缺点,Objective-C 选择用堆存储对象。

二 . 真正的栈对象block
入行第一年的时候老人就告诉我们想持有一个 block 要用 copy 将 block 从栈拷贝到堆上。 Objective-C 里的 block 却是栈对象,因此栈对象面临的问题在 block 身上一个都不少,但由于 block 是仅有的特殊对象,大家对它的特殊都已经习惯了,

另外,根据前面所说,栈对象的有效区域仅限于其所在的块,因此像下面的代码就无法输出期望的结果:

void (^block)();
if(x)
{
block = ^{ printf("x\n"); };
}
else
{
block = ^{ printf("not x\n"); };
}
block();

这也是大家需要特别注意的地方。

相关文章

  • OC堆和栈存储内容的区别

    举例:对象存储在堆,而block存储在栈。创建一个对象: 这行代码创建了一个obj对象,指针obj存储在栈,obj...

  • Js的浅拷贝与深拷贝

    堆和栈的区别 堆和栈都是内存中划分出来的用于存储的区域。 深拷贝与浅拷贝的区别就是其在内存中存储的类型不同。 栈(...

  • JVM调优

    一、理解堆和栈的区别1:堆是存储数据的,栈中是存储程序的执行逻辑2:堆中存放基本数据类型以及对象的引用,栈中存储对...

  • 面试题2

    1.堆和栈区别 栈内存存储的是局部变量而堆内存存储的是实体 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很...

  • 【搬运】堆和栈的区别是什么

    很多人对于堆和栈的区别都感到迷惑,因此我们列出了许多堆和栈的问题和回答,或许对你有帮助。 1. 堆和栈存储在哪里?...

  • OC中的栈和堆区别

    一、管理方式: 栈是由编译器自动管理的,不需要我们手动释放。 堆是系统通过链表管理维护的,由我们自己申请和释放,容...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • 2019-09-26

    包装类和基本数据类型的区别: 区别: 1.基本类型存储在栈里,包装类型存储在堆里。因为栈的效率更高,所以保留...

  • js的深拷贝和浅拷贝

    学习之前,先了解下堆和栈知识,js 的数据类型 堆和栈的区别 其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型...

  • GeekBand oc课程笔记

    oc课程笔记 堆和栈的区别 指针是存放在“栈”上,而对象时存放在“堆”上的,访问对象职能通过指针的方式来访问。 栈...

网友评论

      本文标题:OC堆和栈存储内容的区别

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