为什么Objective-C对象必须要动态分配内存?为什么我必须将它定义为指向对象的指针,而不像在C++中可以在栈上创建对象? 谢谢。
为什么Objective-C对象必须要动态分配内存?为什么我必须将它定义为指向对象的指针,而不像在C++中可以在栈上创建对象? 谢谢。
主要原因:不知道要保留多少堆栈大小。
现有的约定和用途也使得解除限制非常困难。
动态消息在这种情况下无关紧要,因为在初始化时设置正确的 'vtable' 很容易。
在 C++ 中,堆栈对象的大小始终是已知的(如果错误,你知道会发生什么)。Objc 的分配/初始化序列可以返回任何一个不同大小的类型(它本质上是一个工厂),或者完全没有返回值。
大小还可以在运行时变化(例如,你可以通过运行时向类添加字段)。
更新 1
我对此很好奇,所以我做了一个小测试程序作为概念证明。
我能够实现一个简单的基于堆栈的 Objc 类层次结构,它也实现了相当一部分 NSObject
的接口 - 当然,省略了与引用计数和动态分配接口无关的部分。无论如何,我的简单类层次结构与 NSObject 类或协议并不完全兼容,因此,它不应该在期望 NSObject 类型的地方使用,理由很明显。因此,如果你确实想要基于堆栈的 Objc 对象,这是可能的(而且不是特别困难)。
你不需要像 C++ 一样做任何不同的事情来保留堆栈空间。在某些领域中,堆栈大小仍然是限制因素(考虑工厂方法、类集群等)。
还有一些运行时功能默认情况下将无法工作。最好的例子是动态添加实例变量的能力。如果需要,你可以实现此功能。我没有费心思去做那个练习。
当然,基础接口可能会有几个偏差 - 我为了好玩加了一种偏差,即添加交换活动对象的实现(类型)的能力。
玩得开心
更新 2
事实证明,GCC接受了我编写的概念验证。不幸的是,由于在保留正确尺寸时可能遇到的问题和危险(考虑到语言的动态特性...),这在clang中已被禁止。例如:clang禁止sizeof(NSObject)
。哦,好吧。
return new MON::t_string(number);
。无论好坏,C++都有更多的东西。 - justinObjective-C是一种动态语言,这意味着它的所有内容都可以在运行时更改。对象的类对象仅在从可执行文件中加载时创建,并且可以通过分类进行更改。此外,运行时可以为属性实例化变量。由于编译后对象的很多方面都可以更改,因此只有在使用时才能创建它。