Objective-C 是否有类似的东西,或者可能有一些方法可以实现/模拟这个?
没有。这不是一个大问题,一旦你消化了你正在使用 Objective-C 的抽象层。了解对象是引用计数的并且是堆分配。
现在有两种方法可以做到这一点:
a) 使用 Objective-C++——只需将语言特性与您的内容混合并匹配即可。
b) 使用惯用的 Objective-C。这要追溯到很久以前。一旦你接受对象是引用计数的堆分配并且没有办法解决这个问题(使用 clang),那么你就会学会以不同的方式处理程序。当然,对所有内容进行引用计数并将其放入堆中是有成本的,但在某些情况下您可以利用这些特征。最显着的用途是使用不可变对象和浅拷贝。复制std::string
as 对象将导致 SSO 复制或堆分配。复制一个NSString
可以简单地返回自身(在增加或不增加引用计数之后,取决于它是字符串的类型,它可能还需要在该点创建一个具体的副本)。同样,这些对象都只是指针,因此您无需积极关心如何传递对象(值/引用/常量引用/移动)。ObjC 中存在一个更简单的模型,可以利用它。所以这里的设计发生了转变:ObjC 中的“价值优势”减少了,而“支持不变性和共享”更多。
在某些情况下,您可以编写一个 move 方法。由于通用框架类不支持这一点,因此使用对象组合通常更有意义。
由于对象是在堆上分配的,因此移动并不那么重要。精心设计的类考虑了成本以最小化巨大/昂贵的副本,并在内部使用了一些有趣的优化。该成语只是建议您应该采用不同的方法来创建您的类——它们如何共享数据?什么是可变的?什么必须复制?有时,您可能正在处理大的、可变/昂贵的数据并且移动会很方便,但您通常可以将其放在共享容器对象中或重新考虑对象初始化的语义,以最大限度地减少物理复制(并避免奇怪的对象接口中的语义)。除此之外,我不认为移动在纯 Objective-C 中非常有用。当然,它们对于被设计为利用移动语义并能够在多个内存位置创建对象的 C++ 库变得很重要。如果您确实移动了,您通常希望保持该细节的私密性或使其非常明显(例如,我在渲染管道中完成了该操作,以最大程度地减少每个过滤器的大分配)。
您认为有益的示例也将有助于理解您的问题/理由。