クラスメソッドとインスタンスメソッドの違いは何ですか?
インスタンスメソッドはアクセサ(ゲッターとセッター)ですが、クラスメソッドはほとんどすべてのものですか?
他のほとんどの答えが言っているように、インスタンスメソッドはクラスのインスタンスを使用しますが、クラスメソッドはクラス名だけで使用できます。 Objective-Cでは、次のように定義されています。
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
それから、それらはそのように使われることができました:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
クラスメソッドの実際の例としては、NSString
の+stringWithFormat:
やNSArray
の+arrayWithArray:
など、多くのFoundationクラスの便利なメソッドがあります。インスタンスメソッドはNSArray
の-count
メソッドになります。
すべての技術的詳細は他の回答でうまくカバーされています。私はクラスとインスタンスの違いをうまく説明していると思う単純な類推を共有したいと思います。
class は家の blueprint のようなものです。あなたは青写真を1つしか持っておらず、(通常は)青写真だけではそれほどできません。
instance (または object )は、青写真に基づいて構築する実際の house です。同じ青写真から多数の家を構築できます。その後、他のインスタンスに影響を与えずにクラスの各インスタンスのプロパティを個別に変更できるのと同じように、それぞれの家で壁を異なる色でペイントできます。
他の答えが言っているように、インスタンスメソッドはオブジェクトを操作し、そのインスタンス変数にアクセスできますが、クラスメソッドはクラス全体を操作し、特定のインスタンスの変数にはアクセスできませんパラメータ)。
クラスメソッドの良い例は、クラスのインスタンスの総数を返すcounter-typeメソッドです。クラスメソッドは+
で始まり、インスタンスメソッドは-
で始まります。例えば:
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
もう1つの例は、ユーザに呼び出せるようにしたいメソッドがある場合、それをクラスメソッドにするのがよい場合があります。たとえば、MathFunctionsというクラスがある場合は、これを実行できます。
+ (int)square:(int)num{
return num * num;
}
したがって、ユーザーは次のように呼び出します。
[MathFunctions square:34];
クラスをインスタンス化する必要なしに!
NSArrayのように、自動解放されたオブジェクトを返すためにクラス関数を使うこともできます。
+ (NSArray *)arrayWithObject:(id)object
それはオブジェクトを受け取り、それを配列に入れ、そしてメモリ管理される必要がない自動解放されたバージョンの配列を返します。
いつそして/またはなぜあなたがクラスメソッドを使うべきなのか理解していることを願っています!
インスタンスメソッドはクラスのインスタンス(すなわちオブジェクト)に適用され、クラスメソッドはクラス自体に適用される。
C#では、クラスメソッドは静的とマークされています。静的とマークされていないメソッドとプロパティはインスタンスメソッドです。
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
これを理解する最も良い方法はalloc
name__とinit
name__を見ることです。私が違いを理解することを可能にしたのはこの説明でした。
クラスメソッド
クラスメソッドはクラス全体に適用されます。 alloc
name__メソッドをチェックすると、メソッド宣言の前に+
で示されるクラスメソッドです。それはそのクラスの特定のインスタンスを作るためにクラスに適用されるのでクラスメソッドです。
インスタンスメソッド
インスタンスメソッドを使用して、クラス全体ではなく、そのインスタンスに固有のクラスの特定のインスタンスを変更します。たとえば、init
name__(メソッド宣言の前に-
で示されている)は、alloc
name__を使用して作成した後に通常そのクラスのプロパティを変更しているため、インスタンスメソッドです。
例
NSString *myString = [NSString alloc];
そのクラスのインスタンスを生成するために、クラスメソッドalloc
name__を呼び出しています。メッセージの受信者がクラスであることに注意してください。
[myString initWithFormat:@"Hope this answer helps someone"];
NSString
name__という名前のmyString
name__のインスタンスを変更するには、そのインスタンスにいくつかのプロパティを設定します。メッセージの受信者がインスタンス(クラスNSString
name__のオブジェクト)であることに注意してください。
あなたの質問に対する答えはObjective-Cに固有のものではありませんが、異なる言語では、Classメソッドは静的メソッドと呼ばれることがあります。
クラスメソッドとインスタンスメソッドの違いは
クラスメソッド
インスタンスメソッド
だから私はそれを正しく理解すれば。
class
メソッドは、それを使用/処理するためにそのオブジェクトのインスタンスを割り当てる必要はありません。 class
メソッドは自己完結型で、そのクラスのどのオブジェクトの状態にも依存せずに動作できます。そのクラスのどのインスタンスも、そのクラスメソッドへの前回の呼び出しで割り当てられたメモリを解放することはできないため、class
メソッドはそれ自身のすべての作業にメモリを割り当て、完了すると割り当てを解除することが期待されます。
instance
メソッドは正反対です。そのクラスのインスタンスを割り当てない限り、それを呼び出すことはできません。これは、コンストラクタを持ち、デストラクタを持つことができる通常のクラスのようです(割り当てられたメモリをすべてクリーンアップします)。
ほとんどの場合、(再利用可能なライブラリを書いているのでなければ、class
変数は必要ないはずです。
クラスメソッドは通常、そのクラスのインスタンスを作成するために使用されます。
たとえば、[NSString stringWithFormat:@"SomeParameter"];
は、送信されたパラメータとともにNSString
インスタンスを返します。したがって、その型のオブジェクトを返すのはClassメソッドなので、便利メソッドとも呼ばれます。
インスタンスメソッドはクラスのインスタンス(つまり "オブジェクト")を操作します。クラスメソッドはクラスに関連付けられています(ほとんどの言語はこれらの人たちのためにキーワードstatic
を使います)。
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];
クラスメソッドは通常、クラスの新しいインスタンスを作成するか、クラスのグローバルプロパティを取得します。クラスメソッドはインスタンスを操作したり、インスタンス変数にアクセスしたりしません。
インスタンスメソッドは、クラスの特定のインスタンスに対して機能します。たとえば、実装したアクセサメソッドはすべてインスタンスメソッドです。特定のオブジェクトのインスタンス変数を設定または取得するためにそれらを使用します。
インスタンスメソッドを呼び出すには、メッセージをクラスのインスタンスに送信します。
クラスメソッドを呼び出すには、メッセージをクラスに直接送信します。
クラスメソッド
静的として宣言されているメソッドです。このメソッドは、クラスのインスタンスを作成せずに呼び出すことができます。クラスメソッドはインスタンスメンバーを認識しないため、クラスメソッドはクラスメンバーのみを操作でき、インスタンスメンバーは操作できません。クラスのインスタンスメソッドは、そのクラスのインスタンスで呼び出されていない限り、クラスメソッド内から呼び出すこともできません。
インスタンスメソッド
一方、クラスのインスタンスは呼び出す前に存在している必要があるため、newキーワードを使用してクラスのインスタンスを作成する必要があります。インスタンスメソッドはクラスの特定のインスタンスを操作します。インスタンスメソッドは静的として宣言されていません。
たとえば、多くの車がスポーンされるゲームを考えてみてください。それぞれがCCarクラスに属します。車がインスタンス化されると、
[CCar registerCar:self]
CCarクラスは、インスタンス化されたすべてのCCarのリストを作成できます。ユーザーがレベルを終了し、すべての車を削除したい場合... 1-手動で作成したすべてのCCarのリストを確認し、whicheverCar.remove();
を実行するか、2- CCarにremoveAllCarsメソッドを追加します。 [CCar removeAllCars]を呼び出したときにあなたのために。つまりallCars[n].remove();
または、たとえば、起動時にロードおよび保存されるアプリ全体のデフォルトのフォントサイズをユーザーが指定できるようにします。クラスメソッドがなければ、次のようなことをしなければならないかもしれません
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
クラスメソッドを使用すると、[FontHandler getDefaultFontSize]
で処理できます。
RemoveVowels関数については、C#のような言語には、実際にはtoLowerやtoUpperなどの特定のメソッドの両方があることがわかります。
例えばmyString.removeVowels()
およびString.removeVowels(myString)
(ObjCでは[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]
を呼び出します
明確な答えはありませんが、クラスメソッドを押し込んでコードを改善したい場合は、それを試してみてください。クラスメソッドでは、他のクラスメソッド/変数しか使用できないことに注意してください。
クラスメソッドは、インスタンス変数の値を変更したり知ることはできません。それは、インスタンスメソッドがクラスメソッドになることができるかどうかを知るための基準となるはずです。
上記の回答を更新したところ、インスタンスメソッドはクラスのインスタンスを使用するのに対し、クラスメソッドはクラス名だけで使用できることに同意します。
Objective-Cでは、自動参照カウントが発生した後のインスタンスメソッドとクラスメソッドの間に違いはありません。
Example[NS StringWithformat:..]
クラスメソッドと[[NSString alloc] initwihtformat:..]
インスタンスメソッドは、どちらもARCの後で同じです。
また、同じ考え方が変数にも当てはまります。メソッドや関数の場合と同じように、変数について話すときは、静的、メンバ、インスタンス、クラスなどの用語に遭遇します。
Obj-Cコミュニティでの一般的な用語は、インスタンス変数としてはivarですが、私はまだObj-Cの男ではありません。
注: これは疑似コード形式のみです
クラスメソッド
ほとんど必要なことは、 コンパイル時 の間だけです。ユーザー入力は不要で、計算もインスタンスに基づいていません。それについてのすべてはクラス/青写真に基づいています - それはユニークです、すなわち、あなたは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];