web-dev-qa-db-ja.com

クラスメッドとインスタレーションメソッドの違いは何ですか?

クラスメソッドとインスタンスメソッドの違いは何ですか?

インスタンスメソッドはアクセサ(ゲッターとセッター)ですが、クラスメソッドはほとんどすべてのものですか?

435
Devoted

他のほとんどの答えが言っているように、インスタンスメソッドはクラスのインスタンスを使用しますが、クラスメソッドはクラス名だけで使用できます。 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メソッドになります。

660
Cory Kilger

すべての技術的詳細は他の回答でうまくカバーされています。私はクラスとインスタンスの違いをうまく説明していると思う単純な類推を共有したいと思います。

enter image description here

class は家の blueprint のようなものです。あなたは青写真を1つしか持っておらず、(通常は)青写真だけではそれほどできません。

enter image description here

instance (または object )は、青写真に基づいて構築する実際の house です。同じ青写真から多数の家を構築できます。その後、他のインスタンスに影響を与えずにクラスの各インスタンスのプロパティを個別に変更できるのと同じように、それぞれの家で壁を異なる色でペイントできます。

191

他の答えが言っているように、インスタンスメソッドはオブジェクトを操作し、そのインスタンス変数にアクセスできますが、クラスメソッドはクラス全体を操作し、特定のインスタンスの変数にはアクセスできませんパラメータ)。

クラスメソッドの良い例は、クラスのインスタンスの総数を返す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

それはオブジェクトを受け取り、それを配列に入れ、そしてメモリ管理される必要がない自動解放されたバージョンの配列を返します。

いつそして/またはなぜあなたがクラスメソッドを使うべきなのか理解していることを願っています!

102
micmoo

インスタンスメソッドはクラスのインスタンス(すなわちオブジェクト)に適用され、クラスメソッドはクラス自体に適用される。

C#では、クラスメソッドは静的とマークされています。静的とマークされていないメソッドとプロパティはインスタンスメソッドです。

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
35
Robert Horvick

これを理解する最も良い方法はallocname__とinitname__を見ることです。私が違いを理解することを可能にしたのはこの説明でした。

クラスメソッド

クラスメソッドはクラス全体に適用されます。 allocname__メソッドをチェックすると、メソッド宣言の前に+で示されるクラスメソッドです。それはそのクラスの特定のインスタンスを作るためにクラスに適用されるのでクラスメソッドです。

インスタンスメソッド

インスタンスメソッドを使用して、クラス全体ではなく、そのインスタンスに固有のクラスの特定のインスタンスを変更します。たとえば、initname__(メソッド宣言の前に-で示されている)は、allocname__を使用して作成した後に通常そのクラスのプロパティを変更しているため、インスタンスメソッドです。

NSString *myString = [NSString alloc];

そのクラスのインスタンスを生成するために、クラスメソッドallocname__を呼び出しています。メッセージの受信者がクラスであることに注意してください。

[myString initWithFormat:@"Hope this answer helps someone"];

NSStringname__という名前のmyStringname__のインスタンスを変更するには、そのインスタンスにいくつかのプロパティを設定します。メッセージの受信者がインスタンス(クラスNSStringname__のオブジェクト)であることに注意してください。

16
Adam Waite

あなたの質問に対する答えはObjective-Cに固有のものではありませんが、異なる言語では、Classメソッドは静的メソッドと呼ばれることがあります。

クラスメソッドとインスタンスメソッドの違いは

クラスメソッド

  • クラス変数を操作します(それらはインスタンス変数にアクセスできません)
  • オブジェクトを適用するためにインスタンス化する必要はありません
  • 時にはコードの匂いがすることがあります(OOPに不慣れな人は、OO環境で構造化プログラミングを行うための松葉杖として使用することがあります)

インスタンスメソッド

  • インスタンス変数とクラス変数を操作する
  • 操作するインスタンス化されたオブジェクトが必要です
15
hhafez

だから私はそれを正しく理解すれば。

classメソッドは、それを使用/処理するためにそのオブジェクトのインスタンスを割り当てる必要はありません。 classメソッドは自己完結型で、そのクラスのどのオブジェクトの状態にも依存せずに動作できます。そのクラスのどのインスタンスも、そのクラスメソッドへの前回の呼び出しで割り当てられたメモリを解放することはできないため、classメソッドはそれ自身のすべての作業にメモリを割り当て、完了すると割り当てを解除することが期待されます。

instanceメソッドは正反対です。そのクラスのインスタンスを割り当てない限り、それを呼び出すことはできません。これは、コンストラクタを持ち、デストラクタを持つことができる通常のクラスのようです(割り当てられたメモリをすべてクリーンアップします)。

ほとんどの場合、(再利用可能なライブラリを書いているのでなければ、class変数は必要ないはずです。

6
Siddharth

クラスメソッドは通常、そのクラスのインスタンスを作成するために使用されます。

たとえば、[NSString stringWithFormat:@"SomeParameter"];は、送信されたパラメータとともにNSStringインスタンスを返します。したがって、その型のオブジェクトを返すのはClassメソッドなので、便利メソッドとも呼ばれます。

6
iosrookie

インスタンスメソッドはクラスのインスタンス(つまり "オブジェクト")を操作します。クラスメソッドはクラスに関連付けられています(ほとんどの言語はこれらの人たちのためにキーワードstaticを使います)。

4
eduffy

Objective-Cでは、すべてのメソッドが「 - 」または「+」の文字で始まります。例:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

"+"と " - "の文字は、メソッドがそれぞれclass methodinstance 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];
3
Tulon

クラスメソッド


クラスメソッドは通常、クラスの新しいインスタンスを作成するか、クラスのグローバルプロパティを取得します。クラスメソッドはインスタンスを操作したり、インスタンス変数にアクセスしたりしません。


インスタンスメソッド


インスタンスメソッドは、クラスの特定のインスタンスに対して機能します。たとえば、実装したアクセサメソッドはすべてインスタンスメソッドです。特定のオブジェクトのインスタンス変数を設定または取得するためにそれらを使用します。


招く


インスタンスメソッドを呼び出すには、メッセージをクラスのインスタンスに送信します。

クラスメソッドを呼び出すには、メッセージをクラスに直接送信します。


出典: IOS - Objective-C - クラスメソッドとインスタンスメソッド

3
Nam N. HUYNH

クラスメソッド

静的として宣言されているメソッドです。このメソッドは、クラスのインスタンスを作成せずに呼び出すことができます。クラスメソッドはインスタンスメンバーを認識しないため、クラスメソッドはクラスメンバーのみを操作でき、インスタンスメンバーは操作できません。クラスのインスタンスメソッドは、そのクラスのインスタンスで呼び出されていない限り、クラスメソッド内から呼び出すこともできません。

インスタンスメソッド

一方、クラスのインスタンスは呼び出す前に存在している必要があるため、newキーワードを使用してクラスのインスタンスを作成する必要があります。インスタンスメソッドはクラスの特定のインスタンスを操作します。インスタンスメソッドは静的として宣言されていません。

3
iCrazyDev

たとえば、多くの車がスポーンされるゲームを考えてみてください。それぞれが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]を呼び出します

明確な答えはありませんが、クラスメソッドを押し込んでコードを改善したい場合は、それを試してみてください。クラスメソッドでは、他のクラスメソッド/変数しか使用できないことに注意してください。

3
sicklebrick

クラスメソッドは、インスタンス変数の値を変更したり知ることはできません。それは、インスタンスメソッドがクラスメソッドになることができるかどうかを知るための基準となるはずです。

1
Deepee

上記の回答を更新したところ、インスタンスメソッドはクラスのインスタンスを使用するのに対し、クラスメソッドはクラス名だけで使用できることに同意します。

Objective-Cでは、自動参照カウントが発生した後のインスタンスメソッドとクラスメソッドの間に違いはありません。

Example[NS StringWithformat:..]クラスメソッドと[[NSString alloc] initwihtformat:..]インスタンスメソッドは、どちらもARCの後で同じです。

1
user1292809

また、同じ考え方が変数にも当てはまります。メソッドや関数の場合と同じように、変数について話すときは、静的、メンバ、インスタンス、クラスなどの用語に遭遇します。

Obj-Cコミュニティでの一般的な用語は、インスタンス変数としてはivarですが、私はまだObj-Cの男ではありません。

1
Half_Duplex

注: これは疑似コード形式のみです

クラスメソッド

ほとんど必要なことは、 コンパイル時 の間だけです。ユーザー入力は不要で、計算もインスタンスに基づいていません。それについてのすべてはクラス/青写真に基づいています - それはユニークです、すなわち、あなたは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から来ているのであれば、型メソッドはクラスメソッドと同じです。

1
Honey

上記の回答に追加する

クラスメソッド クラスで動作します、私たちは+ stringWithFormat、クラスのサイズそして最も重要なことにinitなどのような一般的な目的のためにこれを使います。

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

インスタンスメソッド 私たちは2人の人を持っているのでクラスのインスタンスではなくクラスのインスタンスで動作します。ここではインスタンスメソッドを使用する必要があります。それは一般的な反応を返さないので。例えばNSSArrayなどの数を決めるのと同じように。

[johnson getAccountBalance];
[ankit getAccountBalance];
0
Ankit garg