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).那好吧.
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |