Objective-Cには似たようなものがありますか、それともこれを実装/エミュレートする方法がいくつかありますか?
いいえ。Objective-Cで作業している抽象化レイヤーを消化したら、これは大きな問題ではありません。オブジェクトは参照カウントされ、ヒープ割り当てであることを理解してください。
これを行うには2つの方法があります。
a)Objective-C++を使用する-言語機能をコンテンツに組み合わせるだけです。
b)慣用的なObjective-Cを使用します。これは長い間遡ります。オブジェクトが参照カウントされたヒープ割り当てであり、それを回避する方法がないことを受け入れたら(clangを使用)、プログラムに別の方法でアプローチする方法を学びます。確かに、すべてをカウントしてヒープに配置することにはコストがかかりますが、シナリオによってはこれらの特性を利用できます。最も注目すべき用途は、不変オブジェクトの使用と浅いコピーです。asオブジェクトをコピーするstd::string
と、SSOコピーまたはヒープ割り当てが発生します。をコピーするNSString
単純に自分自身を返すことができます(参照カウントをインクリメントした後、文字列のタイプによっては、その時点で具体的なコピーを作成する必要がある場合もあります)。また、これらのオブジェクトはすべて単なるポインタであるため、オブジェクトの受け渡し方法(値/参照/定数参照/移動)を積極的に気にする必要はありません。ObjCにははるかに単純なモデルがあり、これを利用できます。したがって、ここでは設計に変化があります。ObjCでは「価値の優位性」が少なくなり、「不変性と共有を優先する」ことが多くなります。
場合によっては、moveメソッドを作成できます。一般的なフレームワーククラスはこれをサポートしていないため、通常、オブジェクトコンポジションを使用する方が理にかなっています。
オブジェクトはヒープに割り当てられるため、移動はそれほど重要ではありません。適切に設計されたクラスは、巨大で高価なコピーを最小限に抑えるためにコストを考慮し、内部的にいくつかの興味深い最適化を使用します。このイディオムは、クラスを作成するために別のアプローチを取る必要があることを示唆しているだけです。クラスはどのようにデータを共有するのでしょうか。可変とは何ですか?何をコピーする必要がありますか?場合によっては、大きくて可変/高価なデータを処理していて、移動が便利な場合もありますが、物理的なコピーを最小限に抑えるために(そして奇妙なことを避けるために、共有コンテナオブジェクトに配置するか、オブジェクトの初期化のセマンティクスを再検討することができます)。オブジェクトインターフェイスのセマンティクス)。それを超えて、純粋なObjective-Cでは動きがあまりにも頻繁に役立つとは思いません。もちろん、これらは、移動セマンティクスを利用するように設計され、複数のメモリ位置にオブジェクトを作成できるC++ライブラリにとって重要になります。移動する場合は、通常、その詳細を非公開にするか、実際に明確にする必要があります(たとえば、各フィルターへの大きな割り当てを最小限に抑えるために、レンダリングパイプラインでそれを実行しました)。
あなたがそれが有益であると思うところの例はまたあなたの問題/合理性を理解するのを助けるでしょう。