質問

のObjective-Cでの単一のアンダースコアはどうやらAppleの「内部」使用のために予約されて(とAppleの主張する前にプライベートインスタンス変数で使用することができました)。しかし、なぜ彼らは、iPhoneのための彼らのSQLiteBooksの例では、のダブルの-underscoreを使うのでしょうか? MasterViewController.mから撮影したこのスニペットを参照してください。

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

ダブルアンダースコアの使用の言及は、このそれがCに関連するフォーラムを - それがためだ「compierの内部使用。」私は、このような状況で適用可能ですどのように私は見ていないと思います。

私はずっとSQLiteBooksサンプルプロジェクト内の1つのように振る舞うが、この2つの下線が当惑私を持っているでしょう私のアプリでのViewControllerを必要としています。

役に立ちましたか?

解決

Cコンパイラでも有数のいずれかの異なった他の変数名以外を強調しているとのObjective-Cコンパイラは変数名を扱いますどちらも。シングルまたはダブル先頭の下線は、の規則の、効果的にははるかにNSなどのCocoaクラスで使用NSString接頭辞のように、名前空間を形成するだけです。

SQLiteBooksコードを見ると、MasterViewController.mこの静的グローバル変数を定義します。

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

だから私の推測では、SQLiteBooksの著者は、グローバル変数を示すために、二重先頭の下線を使用していることです。

Cコンパイラ(と拡張子のObjective-Cによる)予備名が標準ライブラリを実装するために使用されるグローバル変数や関数のために使用するように予約された名前空間を与え、2つのアンダースコアおよびコンパイラベンダによって使用するために大文字で始まる、またはへ__blockのような新しい非標準のキーワードをご紹介します。

SQLiteBooksコードは技術的に有効ですが、

、それがあまりにも簡単に私の意見では、予約の名前空間と混同しています。あなたがそのコードを再利用した場合は、私は(Xcodeのがあなたのためにそれを自動的に行いますとても素敵な名前変更リファクタリングを持っている)、その変数の名前を変更するお勧めします。

他のヒント

コンパイラに、アンダースコアは任意のアルファベット文字と同様に扱われます。より一般的にいえ、アンダースコアは、通常、ユーザーコードとの衝突を避けるために、言語拡張や大きなライブラリーによって使用されます。

グループの多くは、アンダースコアの特定の組み合わせですべての名前を予約しようとするため、

アンダースコアを使用することは問題がある。

Appleは伝統的にプライベートインスタンス変数(オブジェクト指向言語で一般的なスタイル)を示すために、単一のアンダースコアの接頭辞を使用しています。これは、AppleがAppleが自分のヘッダーを変更することにした場合、あなたのコードでアンダースコアを使用すると、ココアと競合しうることを指摘するまで、誰もがアンダースコアで自分のアイバーズの前に付ける必要があることを意味するように取られたと多分あなたはいけません。だから、接頭辞が「お勧めできません」のコーディング慣行となっているアンダーます。

CおよびC誘導体の言語では、二重下線が先行し、以下を有する任意の単語は、非標準の言語拡張です。

__ __attributeなどのAppleの拡張を参照してください。

後続の下線は、しばしば、(コンパイラがマルチパスで特に)元の名前のコンパイラやデバッガ名マングルバージョンとして追加され、これらの名前は、オリジナルとは明らかに異なる残るように、典型的に回避されます。 GoogleはAppleのアンダースコアとの競合を避けるために、アンダースコアで自分のObjective-Cのローカルインスタンス変数をサフィックスます。

私のアドバイス:アンダースコアを使用しないでください。あなたは(それはちょうど混乱だ)インスタンス変数と同じ名前のローカル変数を使用するべきではありません。唯一の潜在的な対立は、setterメソッドのパラメータと対応するインスタンス変数の間にある - これは明確にパラメータを入力値であることを指摘しているので、おそらく、小文字の「a」、「新」(または類似)でパラメータの前に付ける必要がありますまだ「」値ではありません。

それはちょうど、変数の命名規則です。これは、の行うの何もしません。これは、プログラムの作家が自分自身を思い出させるための方法だ、「これはプライベート変数である。」

コンパイラ/ライブラリベンダーは彼らのために「予約」などの特定のプリ/接尾辞を表すためには

それは珍しいことではありません。これは、タイプ間の不慮の衝突を避けるために大部分がある/定義/変数を継承します。

あなたはを参照してくださいポストは定義ではなく、変数に関するれます。多くのコンパイラは、彼らが提供し、に依存している定義のための二重のアンダースコアを使用します。

これはサンプルコードは、このスタイルを使用する理由として - 。原作者は、一日の仕事に彼の日に、彼はおそらく採用し、同じコーディングスタイルを使用し、潜在的な競合が強調されていませんでした。

であるとして、あなたはコードサンプルを保持問題ないはずですが、それはあなたが不快になるならば、あなたは変数の名前を変更することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top