クラスメソッドとインスタンスメソッドの違いは何ですか?
-
20-08-2019 - |
質問
クラスメソッドとインスタンスメソッドの違いは何ですか?
インスタンス メソッドはアクセサー (ゲッターとセッター) であり、クラス メソッドはそれ以外のほとんどすべてですか?
解決
他の回答のほとんどのように、クラスメソッドは、単にクラス名を指定して使用することができるのに対し、インスタンスメソッドは、クラスのインスタンスを使用して、述べています。 Objective-Cで、彼らはthusly定義されています:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
彼らはそのようにのように使用することができます:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
クラスメソッドのいくつかの現実世界の例はNSString
の+stringWithFormat:
またはNSArray
の+arrayWithArray:
のような多くの財団クラスの便利なメソッドです。インスタンスメソッドは、NSArray
の-count
方法になります。
他のヒント
すべての技術的な詳細は他の回答でうまくカバーされています。クラスとインスタンスの違いをうまく説明していると思われる簡単な例えを共有したいと思います。
あ クラス のようなものです 青写真 家の:ブループリントは 1 つしかなく、(通常は) ブループリントだけでは多くのことを行うことはできません。
アン 実例 (または 物体) は実際の 家 ブループリントに基づいて構築するもの:同じ設計図からたくさんの家を建てることができます。その後、他のインスタンスに影響を与えることなく、クラスの各インスタンスのプロパティを個別に変更できるのと同じように、各家の壁を異なる色でペイントできます。
のように、インスタンスメソッドは、オブジェクト上で動作し、クラスメソッドは、全体としてクラスに動作し、インスタンスを渡さない限り、(特定のインスタンスの変数にアクセスできない一方で、そのインスタンス変数へのアクセスを持っています中)をパラメータとしてます。
クラスのメソッドの良い例は、クラスのインスタンスの総数を返しカウンタ型の方法です。インスタンスのものが+
で始まりながら、クラスメソッドは、-
で始まります。
たとえばます:
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.mます:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
出力: 年齢:0 人の数:2
あなたは、ユーザーが呼び出すことができるようにしたいメソッドを持っている場合は、別の例は、クラスメソッドことを確認するために、時々その良いです。あなたは、クラスと呼ばれるMathFunctionsを持っている場合たとえば、あなたはこれを行うことができます:
+ (int)square:(int)num{
return num * num;
}
それではユーザーが呼び出します。
[MathFunctions square:34];
のこれまでのクラスをインスタンス化することなく!の
また、NSArrayのの
のように、自動解放オブジェクトを返すために、クラスの機能を使用することができます+ (NSArray *)arrayWithObject:(id)object
これは、配列にそれを置く、オブジェクトを受け取り、およびメモリ管理、temperorary配列のための素晴らしいとものではありません。
である必要はありません、配列の自動解放バージョンを返します。私はときおよび/またはあなたがクラスのメソッドを使用する必要がありますなぜあなたは今理解してほしい!!
インスタンスメソッドは、クラスメソッドは、クラス自体に適用され、一方、クラスのインスタンス(すなわち、オブジェクト)に適用されます。
は、C#でクラスメソッドは、静的なマークされます。静的マークされていないメソッドとプロパティはインスタンスメソッドです。
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
これを理解する最良の方法は、以下を見ることだと思います alloc
そして init
. 。この説明のおかげで違いが理解できました。
クラスメソッド
クラス メソッドはクラス全体に適用されます。をチェックすると、 alloc
メソッド、これは、によって示されるクラス メソッドです。 +
メソッド宣言の前。これは、クラスの特定のインスタンスを作成するためにクラスに適用されるため、クラス メソッドです。
インスタンスメソッド
インスタンス メソッドを使用すると、クラス全体ではなく、そのインスタンスに固有のクラスの特定のインスタンスを変更できます。 init
たとえば ( -
メソッド宣言の前)、これはインスタンス メソッドです。通常は、クラスが作成された後にそのクラスのプロパティを変更するからです。 alloc
.
例
NSString *myString = [NSString alloc];
クラスメソッドを呼び出しています alloc
そのクラスのインスタンスを生成するため。メッセージの受信者がどのようにクラスであるかに注目してください。
[myString initWithFormat:@"Hope this answer helps someone"];
のインスタンスを変更しています NSString
呼ばれた myString
そのインスタンスにいくつかのプロパティを設定することによって。メッセージの受信者がインスタンス (クラスのオブジェクト) であることに注目してください。 NSString
).
あなたの質問に対する答えは、objective-c に固有のものではありませんが、別の言語では、クラス メソッドは静的メソッドと呼ばれる場合があります。
クラスメソッドとインスタンスメソッドの違いは次のとおりです。
クラスメソッド
- クラス変数を操作します (インスタンス変数にはアクセスできません)
- 適用するためにオブジェクトをインスタンス化する必要はありません
- コードの臭いがする場合もあります (OOP を初めて使用する人の中には、OO 環境で構造化プログラミングを行うための杖として使用する人もいます)
インスタンスメソッド
- インスタンス変数とクラス変数を操作する
- 操作対象のインスタンス化されたオブジェクトが必要です
クラスメソッドは通常、そのクラスのインスタンスを作成するために使用されている。
例えば、[NSString stringWithFormat:@"SomeParameter"];
は、それに送信されるパラメータでNSString
インスタンスを返します。それはそのタイプのオブジェクトを返すクラスメソッドであるため、したがって、それはまた、便利な方法と呼ばれている。
もしそうなら、私はそれを正しく理解しています。
class
方法は、/プロセスにそれを使用するために、そのオブジェクトのインスタンスを割り当てるためにあなたを必要としません。 class
方法は、自己完結型であり、そのクラスのすべてのオブジェクトの状態のいずれかに依存することなく動作することができます。 class
方法は、そのクラスのインスタンスは、クラスメソッドの前回の呼び出しで割り当てられたメモリを解放することができないので、すべての自分の仕事のためにメモリを割り当てるし、終了したら解放することが期待される。
instance
方法はちょうど反対です。あなたはそのクラスのインスタンスを割り当てない限り、あなたはそれを呼び出すことはできません。そのコンストラクタを持っており、(すべての割り当てられたメモリをクリーンアップ)デストラクタを持つことができ、通常のクラスのような。
ほとんどの確率で(、あなたはclass
変数を必要はありません。
インスタンスメソッドは、クラスのインスタンスで動作する(すなわち、「オブジェクト」)。クラスメソッドは、(ほとんどの言語は、これらの人のためのキーワードstatic
を使用)のクラスに関連付けられています。
各クラスCCARに属している...例えば車の多くが生み出されているゲームを取ります。 車がインスタンス化されると、それが呼び出しを行う
[CCar registerCar:self]
だから、CCARクラス、インスタンス化されたすべてのCCARのリストを作ることができます。
あなたはどちらかの可能性...のは、ユーザーがレベルを完了し、すべての車を削除したいとしましょう:
1 - 手動で作成したすべてのCCARのリストを移動し、whicheverCar.remove();
を行います
または
あなたは[CCAR removeAllCars]呼び出すとき2 - はあなたのためにそれを行いますCCARにremoveAllCarsメソッドを追加します。即ちallCars[n].remove();
または、例えば、ユーザーが起動時にロードされ、保存されている全アプリのデフォルトのフォントサイズを指定することができます。 クラスメソッドがなければ、あなたのような何かをする必要がある場合があります。
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
クラスのメソッドを使用すると、[FontHandler getDefaultFontSize]
で逃げることができます。
あなたのremoveVowels機能として、あなたは、C#などの言語が実際にそのようTOLOWERやTOUPPERなどの特定のメソッドの両方を持っていることがわかります。
例えば。 (myString.removeVowels()
されるだろうにObjCで)String.removeVowels(myString)
と[String removeVowels:myString]
ます。
この場合、インスタンスは、おそらくクラスのメソッドを呼び出し、そう両方が利用可能です。 すなわちます。
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
基本的に、myString.toLower()
呼び出し[String toLower:ownValue]
は決定的な答えはありませんが、あなたがあなたのコードを改善するには、クラスのメソッドを押し込むように感じる場合は、それをクラスメソッドのみを使用すると、他のクラスメソッド/変数を使用できるようになることを念頭に置いて撮影し、クマを与えます。
クラスメソッド
静的として宣言されたメソッドです。このメソッドは、クラスのインスタンスを作成せずに呼び出すことができます。クラス メソッドはインスタンス メンバーを認識しないため、クラス メソッドはクラス メンバーに対してのみ操作でき、インスタンス メンバーに対しては操作できません。クラスのインスタンス メソッドは、そのクラスのインスタンス上で呼び出されない限り、クラス メソッド内から呼び出すこともできません。
インスタンスメソッド
一方、呼び出す前にクラスのインスタンスが存在する必要があるため、 new キーワードを使用してクラスのインスタンスを作成する必要があります。インスタンス メソッドは、クラスの特定のインスタンスに対して動作します。インスタンス メソッドは静的として宣言されていません。
すべてのメソッドは、いずれかで始まるのObjective-Cでは「 - 」または「+」の文字。 例:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
「+」と「 - 」の文字は、この方法は、それぞれclass method
又はinstance method
であるか否かを指定する
の違いは明らかです。ここでの方法はMyClass
で宣言されています。
instance method
は、クラスのインスタンスを必要とします:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
MyClass
内の他の方法はMyClass
を使用してself
のインスタンスメソッドを呼び出すことができます:
-(void) someMethod
{
[self instanceMethod];
}
しかし、class methods
はクラス自体に呼び出さなければなりません。
[MyClass classMethod];
それともます:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
これは動作しません。
// Error
[myClass classMethod];
// Error
[self classMethod];
クラスメソッド
<時間>クラスメソッドは、典型的には、クラスの新しいインスタンスを作成するか、またはクラスのいくつかのグローバルプロパティを取得いずれか。クラスメソッドは、インスタンス上で操作したり、インスタンス変数へのアクセスを持っていない。
<時間>インスタンスメソッド
<時間>インスタンスメソッドは、クラスの特定のインスタンス上で動作します。たとえば、あなたが実装さアクセサメソッドは、すべてのインスタンスメソッドです。あなたは、特定のオブジェクトのインスタンス変数を設定または取得するためにそれらを使用します。
<時間>INVOKE
<時間>インスタンスメソッドを呼び出すには、クラスのインスタンスにメッセージを送信します。
クラスのメソッドを呼び出すには、直接クラスにメッセージを送ります。
<時間>クラスメソッドを変更したり、任意のインスタンス変数の値を知ることはできません。つまり、インスタンスメソッドがクラスメソッドであることができるかどうかを知るための基準であるべきである。
また同じ考え方は、変数に適用され、覚えています。あなたはメソッド/関数の場合と同じ変数の話をするときにとても静的、メンバー、例えば、クラスのような用語に出会うとなります。
OBJの-Cコミュニティの共通項は、インスタンス変数のIVARあるようだが、私はまだ、OBJの-Cの男ではありませんよ。
上記の回答への更新は、私は、クラスメソッドは、単にクラス名を指定して使用することができるのに対し、インスタンスメソッドは、クラスのインスタンスを使用して同意します。
自動参照カウントは、Objective-Cで存在に来た後にインスタンスメソッドとクラスメソッドとの間の任意の差がもはや存在します。
Example[NS StringWithformat:..]
のクラスメソッドとインスタンスメソッドを[[NSString alloc] initwihtformat:..]
、両方とも
注記: これは疑似コード形式のみです
クラスメソッド
実行する必要があることはほぼすべて実行されます コンパイル時間. 。ユーザー入力は必要なく、インスタンスに基づいて計算も行われません。すべてはクラス/ブループリントに基づいています。これはユニークです。つまり、1 つのクラスに複数のブループリントがありません。コンパイル時にさまざまなバリエーションを使用できますか?いいえ、したがって、クラスは一意であるため、クラスメソッドを何度呼び出しても、それを指すポインターは同じになります。
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
インスタンスメソッド
逆に、インスタンス メソッドは実行時に発生します。 その時だけ インスタンス化のたびに異なる可能性があるもののインスタンスを作成したということです。
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
他の言語から来た場合、静的メソッドはクラス メソッドと同じです。
Swift から来ている場合、型メソッドはクラス メソッドと同じです。
上記の回答に追加
クラスメソッド +stringWithFormat、クラスのサイズ、そして最も重要なことにinitなどの一般的な目的でこれを使用します。
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
インスタンスメソッド 2人いるようなクラスではなく、クラスのインスタンスで動作します。それぞれのバランスを個別に知りたいので、ここではインスタンスメソッドを使用する必要があります。一般的な応答が返されないためです。例えばNSSArray の数を決定するなど。
[johnson getAccountBalance];
[ankit getAccountBalance];