OC开发

为什么Objective-C对象存储在堆上而不是栈上

2018-03-14  本文已影响61人  JonesCxy

一、什么是栈对象和堆对象

在Objective-C中,对象通常是指一块有特定布局的连续内存区域。我们通常这样创建一个对象

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

这行代码创建了一个NSObject类型的指针obj和一个NSObject类型的对象,obj指针存储在栈上,而其指向的对象则存储在堆上(堆对象)

目前OC并不支持直接在栈上创建对象(栈对象),但可以通过如下方式间接的创建

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

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

二、栈对象优缺点

1、优点

2、缺点

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

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

三、真的没有对象吗

实际上OC里的block却是栈对象,因此栈对象面临的问题在block身上一个都不少,但由于block是仅有的特殊对象,大家对他的特殊性都已经习惯了。
另外,根据前面所说,栈对象的有效区域仅限于其所在的块,因此像下面的代码就无法输出期望的结果:

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

原文链接:http://foggry.com/blog/2017/02/06/wei-shi-yao-objective-c-dui-xiang-cun-chu-zai-dui-shang-er-bu-shi-zhan-shang/

上一篇 下一篇

猜你喜欢

热点阅读