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

可可 – 为什么Objective-C对象必须动态分配?,第1张

概述为什么 Objective-c对象必须动态分配?为什么我必须使它成为一个对象的指针,不像C我可以在堆栈上创建它们? 谢谢. 主要原因:不知道堆栈大小要保留多少. 现有的惯例和用途也使解除限制相当困难. 在这种情况下,动态消息传递并不重要,因为在初始化时设置正确的“vtable”是微不足道的. 在c中,堆栈对象的大小始终是已知的(如果它是错误的,你知道期望什么).一个objc alloc / ini 为什么 Objective-c对象必须动态分配?为什么我必须使它成为一个对象的指针,不像C我可以在堆栈上创建它们?
谢谢.解决方法 主要原因:不知道堆栈大小要保留多少.

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

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

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

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

更新1

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

我能够实现一个简单的基于堆栈的objc类层次结构,它也实现了一个很好的NSObject接口 – 当然,省略引用计数和动态分配接口,因为它与概念证明无关.无论如何,我的简单类层次结构与NSObject类或协议不完全兼容,因此,由于明显的原因,NSObject类型不应该被使用.因此,如果您真的需要基于堆栈的objc对象,则可能(并不特别困难)完成此任务.

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

还有一些运行时功能在默认情况下不起作用.这里最好的例子是在运行时添加ivars的能力.如果您需要,您实际上可以使用此功能.我没有打扰那个练习.

自然地,基本界面可能会产生几个偏差 – 我为乐趣所做的一个偏差是增加了交换生物体的实现(类型)的能力.

玩的开心

更新2

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

总结

以上是内存溢出为你收集整理的可可 – 为什么Objective-C对象必须动态分配?全部内容,希望文章能够帮你解决可可 – 为什么Objective-C对象必须动态分配?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1030347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存