2012-04-24 8 views
2

私はObjective-Cを学んでいますが、クラスのインスタンスとオブジェクトの違いは何か混乱しています - それらは同じですか?相続人の例オブジェクトはクラスのインスタンスと同じですか?

NSString *name = [[NSString alloc]initWithString:@"Harry"]; 

​​はNSStringクラスへのポインタです。 @"Harry"は、文字列の値です。したがってnameオブジェクトはNSStringクラスのオブジェクトか、nameクラスのインスタンスと呼ばれますか?

私が作ったクラスからのもう一つの例:

Rectangle *rect = [[Rectangle alloc]init]; 

ので*rectがポインタです。 rectはオブジェクトですか、それともクラスのインスタンスですか?

答えて

4

ObjectiveCでは、クラスのインスタンスは常にオブジェクトです。オブジェクトは常にクラスのインスタンスです。 「オブジェクト」はクラスのインスタンスであり、チェーンのどこかのクラスは最終的にNSObjectから継承します。スーパークラスのないクラスを宣言すると、NSObjectは暗黙的なスーパークラスになります。

NSString *name = [[NSString alloc] initWithString:@"Harry"]; 

nameより具体的には、「ハリー」の値を有するNSStringのインスタンスであるオブジェクトへのポインタです。すべてのNSStringはオブジェクトです。

Rectangle *rect = [[Rectangle alloc] init]; 

ここに同じです。 rectはオブジェクトへのポインタで、Rectangleのインスタンスです。

3

したがって*rectはポインタです。 rectはオブジェクトですか、それともクラスのインスタンスですか?

両方です。クラスのインスタンスもオブジェクトです。ちょうど私が食べ終わったMcIntoshが "クラス"アップルのインスタンスであり、また果物です。

"オブジェクト"は、ある状態(そのインスタンス変数)を保持し、(一般的に)その状態(そのメソッド)に影響を与えるアクションを実行できるプログラミング構造体の総称です。クラスのインスタンスは、という特定のオブジェクトです。

Objective-Cでは、オブジェクトはポインタでアクセスされます。それはあなたがそれらとやりとりするメカニズムです。厳密に言えば、オブジェクト自体とオブジェクトへのポインタは区別されます:はオブジェクトへのポインタで、クラスRectangleのインスタンスですが、日常的な言語では、人々は同じ方法でそれらについて話しているかもしれません。はRectangle

+0

これは悪い類推です。あなたはプログラミングの専門用語/用語で文法と継承を融合させています – ControlAltDel

+0

@ user1:詳細を教えてください。 "OOP"、 "継承"、 "オブジェクト"、 "インスタンス" _are_プログラミング用語。 –

+0

あなたはあなたのリンゴも果物であるというコメントをしました。これはOOPの例です。そして、それをインスタンスとオブジェクトの両方といいます。これは実際には、この状況では両方の用語を使用できるという単なる説明です。だから最初はOOPで、第2は専門用語のプログラミングについてです – ControlAltDel

2

ポインタはオブジェクトではありません。これは、単にオブジェクトが割り当てられている(記憶されている)メモリ内のアドレスです。したがって、オブジェクトを指しています。ポインタは実際にはObjective-Cが継承するC言語の構造体です(Pardon the pun)。 Juliusは、それらが互換的に使用されていると聞いてくれるのは間違いありません。技術的には「rect」はインスタンス/オブジェクトで、「*」はポインタを渡します。

+0

すべてのあなたの答えをありがとうが、私はまだ少し混乱しています。それでは、rectは単なるポインタであると言っています。 RectはObject(Rectangleクラスのインスタンス)です。メモリはrectに割り当てられます。 – pete

+0

複合タイプです。ローカル変数 'rect'は' * Rectangle'型です。つまり、メモリ内のインスタンスデータが格納されている場所へのポインタです。メモリ内のそのデータには名前はなく、そのデータだけがあります。それを得るための唯一の方法は、それを指すことです(他の言語では、これはオブジェクトへの "参照"を持つと呼ばれます)。さもなければあなたのデータはちょうどRAMチップの中に浮かぶビットです。 –

1

すべてのお返事ありがとうございますが、私はまだ少し混乱しています。それでは、rectは単なるポインタであると言っています。 RectはObject(Rectangleクラスのインスタンス)です。メモリはrectに割り当てられます。

@peteはい正しいです。

関連する問題