クラスメソッドとインスタンスメソッドをいつ、いつ使用しないのか疑問に思っていました。いくつかの実用的な例が必要です。私は本当に混乱しています。別の質問: クラス メソッドでできることとまったく同じことがインスタンス メソッドでできないのでしょうか?
5 に答える
インスタンス オブジェクトまたはインスタンス変数を使用する場合は、インスタンス メソッドを使用する必要があります。Bcz クラス内では、Instance インスタンス オブジェクトまたはインスタンス変数にアクセスできません。
クラス メソッドは静的メソッドです。
クラス メソッド: メソッドは特定のオブジェクトに関連付けられていません。ある意味では、クラスの名前空間で自由な関数のように機能します。「自己」ポインターはありません。たとえば、[UIScreen mainScreen] はクラス メソッドです。これは、画面が 1 つしかなく、複数の「画面インスタンス」を気にする必要がないためです。
インスタンス メソッド: 特定のオブジェクトに結び付けられます。
これは、obj-C だけでなく、ほとんどの OO 言語に当てはまります。
実装レベルでは、インスタンス メソッドの呼び出しには、データ構造 (オブジェクト) への隠しポインターが含まれますが、クラス メソッドには含まれません。
尋ねる実際的な質問は、オブジェクト内のインスタンスデータとしてカプセル化されている、またはカプセル化するのが最適な特定のデータを呼び出しに送信する必要があるかどうかです。
(通常) クラス メソッドをインスタンス メソッドとして使用して同じことを行うことができますが、呼び出しでオブジェクトを可視パラメーターとして明示的に渡す必要があります。 .
ユーティリティ関数にはクラス メソッドを使用し、オブジェクト指向のものにはインスタンス メソッドを使用します。例えば。数学的計算 (例: sin x ) には、クラス メソッドを使用します。ただし、オブジェクトに固有の動作を呼び出すには、インスタンス メソッドを使用します。
名前が示すように、クラスメソッドはクラスにバインドされています。特定のクラスの名前だけでそれらを呼び出すことができます。これらは通常、クラスの公開メソッドにすることができます。たとえば、 NSArray
+ (id)arrayWithArray:(NSArray *)array;
.
クラス名 NSArray で呼び出します。あなたが期待するのは、その特定のクラスのタイプのオブジェクトの作成です。これには、呼び出すオブジェクトは必要ありません。また、これらは必要な非常に基本的なメソッドであるため、クラスメソッドとして作成することをお勧めします。
一方、名前が示すように、インスタンスメソッドはインスタンスに非常にバインドされています。オブジェクトは、クラスの状態 (ivars) と動作 (メソッド) をカプセル化するエンティティです。これは、オブジェクトに非常に固有の場合があります。例えば
- (NSUInteger)count;
NSArray *a とNSArray *bを取りましょう。aに 5 つのアイテムが含まれ、 bに 4 つのアイテムが含まれている場合、これらのインスタンスで呼び出されるインスタンス メソッドは異なる結果を生成します。そのため、インスタンス メソッドを呼び出すときにインスタンスを初期化する必要があります。それらは、呼び出されたオブジェクトのコンテキスト (または状態) で機能します。また、クラス メソッドのように公開されません。
お役に立てれば。