0

私は最近、Mac OSX用のCocoaに関するBigNerdRanchの本を手に入れ、言語全体で一貫して使用されていないように見えるアスタリスク*とアンダースコアの使用に関する適切な説明を探しています。_いくつかの例:

これらは機能的に同等であるように見えます:

NSString* myString;
NSString *myString;

新しい変数にアンダースコアが付けられる場合もあれば、そうでない場合もあります。

NSString _myString;
NSString myString;

そして時々それはすべて狂ってしまいます:

NSString *myString;
NSString *_myString;

メソッドのアスタリスクのバリエーションも確認しました。

- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender
            willSpeakWord:(NSRange)characterRange
                 ofString:(NSString *)string;

では、アスタリスクまたはアンダースコアの機能的な使用法は何ですか?いつ使用するか(または使用しないか)、いつ組み合わせて使用​​する必要がありますか?

4

2 に答える 2

2

*、すべてのObjective-Cオブジェクトであるポインタを示します。(メモリ内のこれらのオブジェクトへのポインタを渡します)。基本的なレベルでは、これらは通常のCポインターです。object->data私の記憶が正しければ、C構造体へのポインターを使用する場合と同じように、を実行することで、Objective-Cオブジェクトの一部のデータにアクセスできます。

これ_はCocoa(および他のいくつかの言語)の規則であり、「このオブジェクトに対してプライベートであると見なされるべきデータの一部」を意味します。

Objective-Cには@private宣言がありますが、これは言語への比較的新しい追加でもあります-コードが2または3年以上前のものである場合(またはOS Xのはるかに古いバージョンを対象としている場合)、使用しない可能性があります@private

この最初の言語インフラストラクチャの欠如のために、これ_は(多くの場合)Cocoaコミュニティによって「ねえ、これを直接設定したり読んだりしないでください」とマークするために使用されます。

それで:

  • Objective-Cクラスを扱う場合、それらは常にポインタであるため、常に*クラス名(のような)に従う必要があります。NSString私はNSString somestringあなたのコードのあなたの行について混乱しています-それはより複雑な警告を生成するか、あなたがそれを使おうとするとクラッシュするでしょう
  • _プライベートデータを示します。Objective-CクラスのセクションのNSString* _nameようなことをします。クラス内のメソッドでそのデータを呼び出したり操作したりする場合は、単独で@interface使用します。_name

つまり、Studentクラスを作成したとします。

// Student.h
@interface Student : NSObject {
  NSString* _name;

}

- (NSString*) name_as_caps;
@end


// Student.m

@implementation Student
- (NSString*) name_as_caps {
   return [_name uppercase];
}

ここでは、「プライベート」データメンバーを持つクラスを宣言します_name。私たちのStudentクラスは何らかの理由でこれを大文字で返す必要があるので、それを行うためのメソッドを作成し、そこでメソッドを使用_nameして呼び出しますuppercase

ここでは、型(またはクラス名)または_nameを数回参照する必要がありました。1回は変数を宣言します。name_as_caps言う必要があるので:this method returns a pointer to an NSString object、したがって、を使用しましNSString *た。

于 2012-05-03T01:01:15.553 に答える
0

ライアンの答えの補遺として、あなたが次のようなものを見たとき

-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)character
RangeofString:(NSString *)string;

引数のタイプを述べるだけのようなもの(NSSpeechSynthesizer *)sender-この場合はNSSpeechSynthesizer*

于 2012-05-04T00:35:34.667 に答える