メソッドの横にあるObjective-Cのプラス記号とマイナス記号はどういう意味ですか?


180

Objective-Cでは、メソッド定義の横の+-記号が何を意味するのか知りたいのですが。

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

回答:


226

+ クラスメソッド用であり、 -用であり、インスタンスメソッド用です。

例えば

// 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".

クラスメソッドとインスタンスメソッドの違いに関する別の質問があります


63
「静的」の余分な5文字は、どういうわけか彼らには多すぎるようです。
アノン。

23
@Anon:メソッドは静的ではありません。これらはクラスメソッドです。これらはオーバーライドでき、クラス階層の大部分を占めます。staticはCで非常に異なる何かを意味します
bbum

4
@エイボン、それはあなたのためのリンゴです、彼らはカメラのフラッシュもマウスの右ボタンも省きます。=)
ポクスタッド2010年

13
@bbumはお金です。Javaが「static」キーワードを別の意味で再利用したという事実は、はるかに古いCの欠点ではありません。その使用法はCでは完全に直感的ではないかもしれませんが、Javaではさらに直感的ではないようです。私は静的が動的の反対であることを期待します—変化しない何か。AppleはOS Xでそれを採用する前に、そしてもちろん、Objective-C言語は、ほぼ15年前から出回っていた
クインテイラー

3
staticメソッドとクラスメソッドの違い:MYBaseClassとそのサブクラスMYSubClassでメソッド+ fooを定義します。NSArray *クラス= @ [[MYBaseClassクラス]、[MYSubClassクラス]]; [クラスmakeObjectsPerformSelector:@selector(foo)]; 静的メソッドでは機能しません。とは言っても、私はどちらか@classmethod@methodいうと、どちらかを好むでしょう。なぜそんなに簡潔なのですか...?
公証人2014

45

(+)クラスメソッドの場合、(-)インスタンスメソッドの場合

(+)クラスメソッド:-

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

(-)インスタンスメソッド:-

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

作成するには?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

使い方?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+メソッドはクラスメソッドです。つまり、インスタンスプロパティにアクセスできないメソッドです。インスタンス変数へのアクセスを必要としない、クラスのallocメソッドやヘルパーメソッドなどのメソッドに使用されます

-メソッドはインスタンスメソッドです-オブジェクトの単一のインスタンスに関連します。通常、クラスのほとんどのメソッドで使用されます。

詳細については、言語仕様を参照してください。


まあ、実際にはクラスメソッドはインスタンス変数にアクセスできます。それらにはインスタンスとしてselfではなく、クラスがあります。それらは単にインスタンスに関連付けられておらず、メソッドのルックアップはインスタンスではなくクラスを通じて行われます。それでも、あなたはそうすることができます+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
公証人2014

5

Appleからのこれについての明確な説明は、「メソッドとメッセージング」セクションの下にあります。

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

簡単に言えば:

+は「クラスメソッド」を意味します

(メソッドはインスタンス化されていないクラスのインスタンスなしで呼び出すことができます)。したがって、次のように呼び出します。

[className classMethod]; 


-「インスタンスメソッド」を意味します

最初にオブジェクトをインスタンス化する必要があります。その後、オブジェクトのメソッドを呼び出すことができます)。次のようにして、オブジェクトを手動でインスタンス化できます。

SomeClass* myInstance = [[SomeClass alloc] init];

(これは本質的にオブジェクトにメモリ空間を割り当ててから、その空間でオブジェクトを初期化します-単純化しすぎますが、それについて考える良い方法です。オブジェクトを個別に割り当てて初期化することはできますが、これを行うことはできません -ポインタに関連する厄介な問題につながる可能性がありますおよびメモリ管理)

次に、インスタンスメソッドを呼び出します。

[myInstance instanceMethod]

Objective Cでオブジェクトのインスタンスを取得する別の方法は次のとおりです。

NSNumber *myNumber = [NSNumber numberWithInt:123];

これはNSNumberクラスの「numberWithInt」クラスメソッドを呼び出しています。これは「ファクトリ」メソッド(つまり、オブジェクトの「既製のインスタンス」を提供するメソッド)です。

Objective Cでは、次のような文字列の場合のように、特別な構文を使用して特定のオブジェクトインスタンスを直接作成することもできます。

NSString * myStringInstance = @ "abc";

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.