クラスメソッドとインスタンスメソッドの違いは何ですか?
インスタンスメソッドはアクセサー(ゲッターとセッター)ですか?クラスメソッドは他のほとんどすべてです?
クラスメソッドとインスタンスメソッドの違いは何ですか?
インスタンスメソッドはアクセサー(ゲッターとセッター)ですか?クラスメソッドは他のほとんどすべてです?
他のほとんどの回答が述べているように、インスタンスメソッドはクラスのインスタンスを使用しますが、クラスメソッドはクラス名だけで使用できます。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
ます。
すべての技術的な詳細は、他の回答でうまくカバーされています。クラスとインスタンスの違いをうまく説明していると思う簡単な例えを共有したいと思います。
クラスは家の青写真のようなものです。青写真は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
もう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
これを理解する最良の方法は、とを見ることだと思いますinit
。違いを理解することができたのはこの説明でした。
クラスメソッド
クラスメソッドは、クラス全体に適用されます。メソッドをチェックすると、それはメソッド宣言alloc
の前に示されているクラスメソッドです。+
これは、そのクラスの特定のインスタンスを作成するためにクラスに適用されるため、クラスメソッドです。
インスタンスメソッド
インスタンスメソッドを使用して、クラス全体ではなく、そのインスタンスに固有のクラスの特定のインスタンスを変更します。init
たとえば(-
メソッド宣言の前に示されている)は、インスタンスメソッドです。これは、通常、で作成された後にそのクラスのプロパティを変更しているためですalloc
。
例
NSString *myString = [NSString alloc];
alloc
そのクラスのインスタンスを生成するために、クラスメソッドを呼び出しています。メッセージの受信者がクラスであることに注意してください。
[myString initWithFormat:@"Hope this answer helps someone"];
NSString
呼び出されたインスタンスを変更するには、そのインスタンスにmyString
いくつかのプロパティを設定します。メッセージの受信者がインスタンス(クラスのオブジェクトNSString
)であることに注意してください。
あなたの質問への答えはobjective-cに固有のものではありませんが、異なる言語では、クラスメソッドは静的メソッドと呼ばれることがあります。
クラスメソッドとインスタンスメソッドの違いは次のとおりです。
クラスメソッド
インスタンスメソッド
クラスメソッドは通常、そのクラスのインスタンスを作成するために使用されます
たとえば、送信されたパラメータを持つインスタンスを[NSString stringWithFormat:@"SomeParameter"];
返します。NSString
したがって、このタイプのオブジェクトを返すのはClassメソッドであるため、コンビニエンスメソッドとも呼ばれます。
だから私がそれを正しく理解していれば。
メソッドは、それclass
を使用/処理するためにそのオブジェクトのインスタンスを割り当てる必要はありません。メソッドは自己完結型class
であり、そのクラスのオブジェクトの状態に依存することなく動作できます。そのclass
クラスのインスタンスは、クラスメソッドへの以前の呼び出しで割り当てられたメモリを解放できないため、メソッドは、それ自体のすべての作業にメモリを割り当て、完了時に割り当てを解除することが期待されます。
方法はinstance
正反対です。そのクラスのインスタンスを割り当てない限り、それを呼び出すことはできません。これは、コンストラクタを持ち、デストラクタ(割り当てられたすべてのメモリをクリーンアップする)を持つことができる通常のクラスのようなものです。
class
ほとんどの場合(再利用可能なライブラリを作成している場合を除き、変数 は必要ありません。
インスタンスメソッドは、クラスのインスタンス(つまり、「オブジェクト」)を操作します。クラスメソッドはクラスに関連付けられています(ほとんどの言語はstatic
これらの人のキーワードを使用します)。
たとえば、たくさんの車がスポーンされるゲームを考えてみましょう。それぞれがクラス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]
明確な答えはありませんが、クラスメソッドを押し込むとコードが改善されると思われる場合は、コードを試してみてください。クラスメソッドでは、他のクラスメソッド/変数しか使用できないことに注意してください。
クラスメソッド
静的として宣言されているメソッドです。クラスのインスタンスを作成せずにメソッドを呼び出すことができます。クラスメソッドはインスタンスメンバーを認識しないため、クラスメソッドはクラスメンバーに対してのみ操作でき、インスタンスメンバーに対しては操作できません。クラスのインスタンスメソッドは、そのクラスのインスタンスで呼び出されていない限り、クラスメソッド内から呼び出すこともできません。
インスタンスメソッド
一方、呼び出す前にクラスのインスタンスが存在する必要があるため、クラスのインスタンスはnewキーワードを使用して作成する必要があります。インスタンスメソッドは、クラスの特定のインスタンスで動作します。インスタンスメソッドは静的として宣言されていません。
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
インスタンスメソッドを呼び出すことができます。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];