1

重複の可能性:
客観的な言語でのポインターのポイントは何ですか

Obj-Cコードでポインタが使用される時期と理由について混乱しています。私はObj-Cを初めて使用し、大学のイントロコースからC++を十分に理解しています。

NSDate *now = [NSDate date];

ここではなく、なぜここでポインターが使用されるのですか(そしてその目的は正確には何ですか?)...

NSUInteger arrayLength = [<some array> count];

私は2番目の例の方がはるかに快適ですが、最初の例はまだ私を困惑させます。

4

2 に答える 2

4

紛らわしいのは Apple の typedef の文言です。

NSUInteger

の空想typedefですunsigned int。したがって、これはスカラー型であり、オブジェクトではありません。このような単純なユースケースでは、一般にそれへのポインターは必要ありません。

でも、

NSDate

Foundation クラスです。これは、そのインスタンスが適切な Objective-C オブジェクトであることを意味します。おそらくご存じのとおり、Objective-C は完全に動的な言語です。クラスの静的インスタンスは許可されていないため、すべてのオブジェクトは本質的にポインターです (つまり、ポインターの背後に割り当てられたメモリです)。したがって、Objective-C オブジェクトを操作するときは、常にオブジェクトへのポインターが必要です。

于 2012-07-18T18:42:30.987 に答える
0

さて、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」として宣言するか、警告を捨てることもできます。

于 2012-07-18T18:47:50.760 に答える