質問

なぜObjective-Cオブジェクトを動的に割り当てる必要があるのですか? C ++とは異なり、オブジェクトへのポインタにする必要があるのはなぜですか?スタックで作成できますか?ありがとう。

役に立ちましたか?

解決

主な理由:予約するスタックサイズの量を知らない。

既存の慣習と使用により、制限の持ち上げも非常に困難になります。

この場合、動的なメッセージは重要ではありません。初期化時に正しい「Vtable」を設定することは些細なことです。

C ++では、スタックオブジェクトのサイズは常に既知です(そして、間違っている場合は、何を期待するかを知っています)。 OBJC Alloc/initシーケンスは、それぞれが異なるサイズ(基本的に工場)で、またはまったく異なるいくつかのタイプのいずれかを返すことができます。

サイズは、実行時にも異なる場合があります(たとえば、ランタイムを介してクラスにフィールドを追加できます)。

更新1

私はこれに興味があったので、概念実証として少しテストプログラムを作成しました。

シンプルなスタックベースのOBJCクラスの階層を実装することができました。 NSObjectのインターフェース - もちろん、概念の証明に関連していなかったため、参照カウントと動的割り当てインターフェイスを省略します。とにかく、私のシンプルなクラスの階層はそうでした いいえ NSObjectクラスまたはプロトコルと完全に互換性があるため、明らかな理由でNSObjectタイプが予想される場合に使用する必要があるものではありません。したがって、それ スタックベースのOBJCオブジェクトが本当に必要な場合、これを達成することは可能です(特に難しくありません)。

スタックスペースを予約するために、C ++とは異なることをする必要はありません。予約するスタックサイズは、一部の領域では依然として制限です(工場の方法、クラスクラスターなどを考慮してください)。

デフォルトでは機能しないランタイム機能もいくつかあります。ここでの最良の例は、実行時にivarを追加する機能です。実際、あなたがそれを必要とするならば、あなたはこの機能を伴うことができます。私はその運動を気にしませんでした。

当然のことながら、ベースインターフェイスはいくつかの逸脱をとることができます - 私が楽しみのために作った逸脱の1つは、生きているオブジェクトの実装(タイプ)を交換する機能を追加することでした。

楽しんで

更新2

結局のところ、GCCは私が書いた概念の証明を受け入れます。残念ながら、これは、正しいサイズを予約する際に遭遇する可能性のある問題/危険のためにClangで禁止されています(言語の動的な特徴を考慮して...)。例:Clang Forbids sizeof(NSObject). 。しかたがない。

他のヒント

Objective-Cは動的な言語です。つまり、それに関するすべてが実行時に変化する可能性があります。オブジェクトのクラスオブジェクトは、実行可能ファイルからロードされたときにのみ作成され、カテゴリで変更できます。また、ランタイムはプロパティの変数をインスタンスすることができます。コンピレーション後にオブジェクトが変更できるため、使用するまで作成することはできません。

これは、Objective-Cが動的バインディングまたは遅延結合を使用する方法のためです。 C ++とは異なり、オブジェクトでクラスの関数を呼び出すか、同じクラスのポインターを介して、またはスーパークラスのポインターを介して選択できます。後者の場合、多型が必要です。

ただし、Objective-Cには、実行時に正しい関数を決定する能力が常に存在します。違いは、たとえばC ++では、コンパイラが使用される関数が存在することを確認する必要がありますが、Objective-Cではコンパイラが実際には気にしないことを確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top