2011-09-09 9 views
1

と、プロパティとメソッドの宣言の前にある - と+の記号が私を多く混乱させます。+と - メソッドのプロパティを定義するときの違いは何ですか?

- (void)methodName:(id)sender {} 

と私は本当にそれを取得しないこのよう

+ (void)methodName:(id)sender {} 

:私は方法をこのように宣言した場合の違いはあります。

+2

嫌なことはありませんが、プライマーを読む必要があるようです。ここから開始:http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_indexhtml –

+0

私はCやJavaのような他の言語を知っていたので、それほど違っていないかもしれないので私は必要ないと思っていました。ありがとう –

答えて

6

'+'メソッドはクラスメソッドであり、メタクラスで直接呼び出すことができます。したがって、インスタンス変数へのアクセスはありません。

' - 'メソッドはインスタンスメソッドであり、クラスの関連するインスタンスにフルアクセスできます。

など。

@interface SomeClass 

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

@property (nonatomic, assign) int someProperty; 

@end 

あなたはその後、実行することができます。

[SomeClass classMethod]; // called directly on the metaclass 

または:

SomeClass *someInstance = etc; 

[someInstance instanceMethod]; // called on an instance of the class 

こと注:

+ (void)classMethod 
{ 
    NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to 
            // instances of the class and this is a class 
            // method 
} 
+0

私はそれを正しく理解すれば、ある程度静的メソッドを呼び出すことと比較することができます。インスタンス化する必要はありません。彼らが外部変数にアクセスできない場合、それらを使用する目的は何ですか?説明してください。迅速な対応のためにありがとうございます。 –

+0

@No One in Particularの回答が何を使用しているのか説明しています。再度、感謝します。 –

+1

これはmetaclassという用語の正しい使い方ではないと思います。http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html –

1

はトミーの答え@上embelishするには、( - )メソッドを「自己」変数を使用するこれはメソッドが動作するクラスインスタンスです。 (+)メソッドはそれを持ちません。例えば

、あなたはクラスFooBarのを持っていたあなたは、次のいずれかの行うことができ、2つのインスタンスを比較したい場合:

+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 { 
     // compare fb1 and fb2 
     // return YES or NO 
} 

または

- (BOOL) compare:(FooBar)fb2 
     // compare self and fb2 
     // return YES or NO 
} 

を第二のルーチンを持っています "第1のルーチンのfb1に類似した「自己」変数である。 (これらのルーチンは不自然ですが、私はあなたが画像を取得します願っています。)

+3

クラスメソッドには隠された 'self'パラメータもありますが、インスタンスではなくクラスオブジェクトを指しています。 –

+0

また、 '+'と '-'を取り囲む括弧は、代わりに戻り型を囲む必要があります。 –

+0

@Bavarious - 訂正していただきありがとうございます。既に編集済みです。 (私はこれをオンザフライに入れています) –

1

- (void)methodName:(id)sender {}

あなたはクラスのインスタンスを作成する意味、インスタンスメソッドであり、オブジェクトのメソッドを呼び出すことができ、あるいは客観的に-Cの説明、オブジェクトセレクタにメッセージを送信します。

+ (void)methodName:(id)sender {}

それはあなたが最初のオブジェクトをインスタンス化せずに、クラス自体を呼び出す静的メソッドである意味、クラスメソッドです。

allocおよびstringWithStringは、クラスメソッドであり、NSStringクラスで直接呼び出します。オブジェクトは必要ありません。一方、initWithStringはインスタンスメソッドで、[NSString alloc]が返すオブジェクトを呼び出します。

NSString* test = [[NSString alloc] initWithString:@"test"]; 

NSString* test2 = [NSString stringWithString:@"test2"]; 
関連する問題