回答:
+
クラスメソッド用であり、 -
用であり、インスタンスメソッド用です。
例えば
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
@classmethod
と@method
いうと、どちらかを好むでしょう。なぜそんなに簡潔なのですか...?
(+)クラスメソッドの場合、(-)インスタンスメソッドの場合
(+)クラスメソッド:-
静的として宣言されているメソッドです。メソッドは、クラスのインスタンスを作成せずに呼び出すことができます。クラスメソッドはインスタンスメンバーを認識しないため、クラスメソッドはクラスメンバーでのみ動作し、インスタンスメンバーでは動作しません。クラスのインスタンスメソッドは、そのクラスのインスタンスで呼び出されていない限り、クラスメソッド内から呼び出すこともできません。
(-)インスタンスメソッド:-
一方、クラスのインスタンスが存在する必要があるため、クラスのインスタンスを作成するには、新しいキーワードを使用してクラスのインスタンスを作成する必要があります。インスタンスメソッドは、クラスの特定のインスタンスを操作します。インスタンスメソッドは静的として宣言されていません。
作成するには?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
使い方?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+メソッドはクラスメソッドです。つまり、インスタンスプロパティにアクセスできないメソッドです。インスタンス変数へのアクセスを必要としない、クラスのallocメソッドやヘルパーメソッドなどのメソッドに使用されます
-メソッドはインスタンスメソッドです-オブジェクトの単一のインスタンスに関連します。通常、クラスのほとんどのメソッドで使用されます。
詳細については、言語仕様を参照してください。
self
ではなく、クラスがあります。それらは単にインスタンスに関連付けられておらず、メソッドのルックアップはインスタンスではなくクラスを通じて行われます。それでも、あなたはそうすることができます+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Appleからのこれについての明確な説明は、「メソッドとメッセージング」セクションの下にあります。
簡単に言えば:
(メソッドはインスタンス化されていないクラスのインスタンスなしで呼び出すことができます)。したがって、次のように呼び出します。
[className classMethod];
最初にオブジェクトをインスタンス化する必要があります。その後、オブジェクトのメソッドを呼び出すことができます)。次のようにして、オブジェクトを手動でインスタンス化できます。
SomeClass* myInstance = [[SomeClass alloc] init];
(これは本質的にオブジェクトにメモリ空間を割り当ててから、その空間でオブジェクトを初期化します-単純化しすぎますが、それについて考える良い方法です。オブジェクトを個別に割り当てて初期化することはできますが、これを行うことはできません -ポインタに関連する厄介な問題につながる可能性がありますおよびメモリ管理)
次に、インスタンスメソッドを呼び出します。
[myInstance instanceMethod]
Objective Cでオブジェクトのインスタンスを取得する別の方法は次のとおりです。
NSNumber *myNumber = [NSNumber numberWithInt:123];
これはNSNumberクラスの「numberWithInt」クラスメソッドを呼び出しています。これは「ファクトリ」メソッド(つまり、オブジェクトの「既製のインスタンス」を提供するメソッド)です。
Objective Cでは、次のような文字列の場合のように、特別な構文を使用して特定のオブジェクトインスタンスを直接作成することもできます。
NSString * myStringInstance = @ "abc";