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