为什么必须动态分配Objective-C对象?

use*_*064 16 cocoa objective-c-runtime foundation static-allocation dynamic-allocation

为什么必须动态分配Objective-c对象?为什么我必须使它成为指向对象的指针,与C++不同,我可以在堆栈上创建它们?谢谢.

jus*_*tin 16

主要原因:不知道要保留多少堆栈大小.

现有的惯例和用途也使解除限制变得相当困难.

在这种情况下,动态消息传递并不重要,因为在初始化时设置正确的'vtable'是微不足道的.

在c ++中,堆栈对象的大小总是已知的(如果它错了,你知道会发生什么).一个objc alloc/init序列可以返回几种类型中的任何一种 - 每种类型具有不同的大小(它本质上是一个工厂),或者根本没有.

大小也可以在运行时变化(例如,您可以通过运行时向类添加字段).

更新1

我很好奇,所以我做了一个小测试程序作为概念证明.

我能够实现一个简单的基于堆栈的objc类层次结构,它也实现了很好NSObject的接口 - 当然,省略了引用计数和动态分配接口,因为它与概念证明无关.无论如何,我的简单类层次结构与NSObject类或协议并不完全兼容,因此,出于显而易见的原因,它不应该在需要NSObject类型的地方使用.因此,如果你真的想要基于堆栈的objc对象,那么实现这一点可能的(而不是特别困难).

你不必做任何与c ++不同的事情来保留堆栈空间.要保留的堆栈大小在某些方面仍然是一个限制(考虑工厂方法,类集群等).

还有一些运行时功能在默认情况下不起作用.这里最好的例子是在运行时添加ivars的能力.如果你需要它,你实际上可以容纳这个功能.我没有打扰这项运动.

当然,基本界面可能会有几个偏差 - 我为了娱乐而做出的一个偏差就是增加了交换生物体的实现(类型)的能力.

玩得开心

更新2

事实证明,GCC接受我写的概念证明.不幸的是,由于在保留正确尺寸时可能遇到的问题/危险(考虑到语言的动态特征......),这已经被禁止了.例如:clang禁止sizeof(NSObject).那好吧.

  • 如果您还没有阅读它:[星期五Q&A 2010-01-15:Objective-C中的堆栈和堆对象](http://www.mikeash.com/pyblog/friday-qa-2010-01-15-堆栈和堆对象-在目标-c.html). (2认同)