459

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

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

4

18 に答える 18

681

他のほとんどの回答が述べているように、インスタンスメソッドはクラスのインスタンスを使用しますが、クラスメソッドはクラス名だけで使用できます。Objective-Cでは、これらは次のように定義されています。

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

その後、次のように使用できます。

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

NSStringクラスメソッドの実際の例としては、 's+stringWithFormat:NSArray'sなどの多くのFoundationクラスの便利なメソッドがあります+arrayWithArray:。インスタンスメソッドはNSArrayのメソッドになり-countます。

于 2009-06-27T21:19:09.380 に答える
196

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

ここに画像の説明を入力してください

クラスは家の青写真のようなものです。青写真は1つしかなく、(通常は)青写真だけではそれほど多くのことを行うことはできません。

ここに画像の説明を入力してください

インスタンス(またはオブジェクト)は、青写真に基づいて構築する実際の家です。同じ青写真から多くの家を建てることができます次に、他のインスタンスに影響を与えることなく、クラスの各インスタンスのプロパティを個別に変更できるのと同じように、各家の壁を異なる色でペイントできます。

于 2013-05-08T08:01:31.150 に答える
104

他の回答が述べているように、インスタンスメソッドはオブジェクトを操作してそのインスタンス変数にアクセスできますが、クラスメソッドはクラス全体を操作して特定のインスタンスの変数にアクセスできません(インスタンスをとして渡さない限り)パラメータ)。

クラスメソッドの良い例は、クラスのインスタンスの総数を返すカウンタータイプのメソッドです。クラスメソッドは。+で始まり、インスタンスメソッドは。で始まります-。例えば:

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

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

クラスメソッドを使用するタイミングや理由を理解していただければ幸いです。

于 2009-06-27T21:57:06.010 に答える
38

インスタンスメソッドはクラスのインスタンス(つまりオブジェクト)に適用されますが、クラスメソッドはクラス自体に適用されます。

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

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
于 2009-06-27T20:51:05.333 に答える
16

allocこれを理解する最良の方法は、とを見ることだと思いますinit。違いを理解することができたのはこの説明でした。

クラスメソッド

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

インスタンスメソッド

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

NSString *myString = [NSString alloc];

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

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

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

于 2012-11-07T09:50:41.110 に答える
16

あなたの質問への答えはobjective-cに固有のものではありませんが、異なる言語では、クラスメソッドは静的メソッドと呼ばれることがあります。

クラスメソッドとインスタンスメソッドの違いは次のとおりです。

クラスメソッド

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

インスタンスメソッド

  • インスタンス変数とクラス変数を操作する
  • 操作するには、インスタンス化されたオブジェクトが必要です
于 2009-06-27T20:57:19.720 に答える
6

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

たとえば、送信されたパラメータを持つインスタンスを[NSString stringWithFormat:@"SomeParameter"];返します。NSStringしたがって、このタイプのオブジェクトを返すのはClassメソッドであるため、コンビニエンスメソッドとも呼ばれます。

于 2010-11-09T06:16:55.203 に答える
6

だから私がそれを正しく理解していれば。

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

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

classほとんどの場合(再利用可能なライブラリを作成している場合を除き、変数 は必要ありません。

于 2013-05-24T01:35:59.563 に答える
4

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

于 2009-06-27T20:51:52.727 に答える
3

たとえば、たくさんの車がスポーンされるゲームを考えてみましょう。それぞれがクラスCCarに属しています。車がインスタンス化されると、

[CCar registerCar:self]

したがって、CCarクラスは、インスタンス化されたすべてのCCarのリストを作成できます。ユーザーがレベルを終了し、すべての車を削除したいとします...次のいずれかを実行できます:1-手動で作成したすべてのCCarのリストを調べて、実行するwhicheverCar.remove(); か、2-CCarにremoveAllCarsメソッドを追加します。 [CCarremoveAllCars]を呼び出すとあなたのために。つまり 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]

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

于 2011-11-16T10:17:35.940 に答える
3

クラスメソッド

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

インスタンスメソッド

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

于 2012-11-07T09:34:24.360 に答える
3

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

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

+ (void) classMethod;
@end

「+」および「-」文字は、メソッドがそれぞれaであるか「-」であるかを指定class methodしますinstance method

これらのメソッドを呼び出すと、違いは明らかです。ここで、メソッドはで宣言されていMyClassます。

instance methodクラスのインスタンスが必要です:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

他のメソッドの内部では、以下を使用するMyClassインスタンスメソッドを呼び出すことができます。MyClassself

-(void) someMethod
{
    [self instanceMethod];
}

ただし、class methodsクラス自体で呼び出す必要があります。

[MyClass classMethod];

または:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

これは機能しません:

// Error
[myClass classMethod];
// Error
[self classMethod];
于 2015-02-04T09:41:08.277 に答える
3

クラスメソッド


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


インスタンスメソッド


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


呼び出す


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

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


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

于 2016-01-23T18:10:29.653 に答える
2

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

于 2011-03-17T15:55:10.837 に答える
1

また、同じ考え方が変数にも当てはまることを忘れないでください。メソッド/関数の場合と同じように変数について話すとき、静的、メンバー、インスタンス、クラスなどの用語に出くわします。

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

于 2012-01-18T14:12:38.430 に答える
1

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

Objective-Cで自動参照カウントが存在するようになった後は、インスタンスメソッドとクラスメソッドの間に違いはありません。

たとえば[NS StringWithformat:..]、クラスメソッドと[[NSString alloc] initwihtformat:..]インスタンスメソッドの場合、どちらもARC以降は同じです。

于 2013-02-25T07:02:11.717 に答える
1

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

クラスメソッド

ほとんどの場合、必要なのはコンパイル時だけです。ユーザー入力は必要ありません。また、インスタンスに基づいて計算されます。それに関するすべては、クラス/ブループリントに基づいています-これはユニークです。つまり、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を使用している場合、型メソッドはクラスメソッドと同じです。

于 2016-06-12T19:18:40.650 に答える
0

上記の回答に追加

クラスメソッドはクラスで機能します。これは、+ stringWithFormatのように、クラスのサイズ、そして最も重要なinitなどの汎用に使用します。

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

インスタンスメソッドは、2人の人間がいるようなクラスではなく、クラスのインスタンスで機能します。ここでは、インスタンスメソッドを使用する必要があります。一般的な応答を返さないためです。たとえば、NSSArrayなどのカウントを決定します。

[johnson getAccountBalance];
[ankit getAccountBalance];
于 2017-02-08T11:38:20.780 に答える