さて、Objective-C と C++ の間にはいくつかの基本的な違いがあります。Objective-C には、実際には「汎用オブジェクト」(型「id」) があり、クラスを気にせずにオブジェクトを渡すことができます。
これを可能にする実装の詳細の 1 つは、Objective-C に「静的」オブジェクトがないことです。すべてのオブジェクトは「new」と同等の方法で作成され、ポインターを介してアクセスされます (文字列リテラルは異なる場合がありますが、「NSString*」型のままです)。これは、Objective-C の場合とまったく同じです。「NSString MyString」を持つことはできません。
このため、すべてのオブジェクトは単純なポインターであり、すべて同じサイズであるため、「オブジェクトは単なるオブジェクトであり、コンパイラーは実際にあなたが扱っているものではありません」ということが可能です。コンパイラは、それらが何であるかを知らなくてもそれらを渡すことができます。コンテナが何であるかを知らなくても、コンテナに格納できます。
Objective-C と C++ はどちらも C の「オブジェクト指向」拡張ですが、それでもかなり異なります。
編集: "NSString* MyString" のようなものを記述して、コンパイラが処理しているオブジェクトの種類を認識できるようにすることができますが、これは単に便利です: 他のオブジェクトをそのポインターに入れることができます (実際、"new"同等の関数は通常 id を返します。私が犯すよくある間違いの 1 つは、ポインターが示すものとは異なるクラスを「新規作成」することです) 良い面としては、たとえば NSWindow* を MyString に割り当てた場合、コンパイラーは警告を発します。 MyString で "open" を呼び出した場合にも警告が表示されます。ただし、これはコンパイラによる追加の利点にすぎません。すべてを「id」として宣言するか、警告を捨てることもできます。