2012-04-21 2 views
3

XCodeテンプレート(少なくともXCode 4.3.2)にいくつかのivarsに2つのアンダースコアが付いていて、XCodeテンプレートのivarsに1つまたは2つのアンダースコアがプレフィックスされています

例えば主従アプリケーションテンプレートは1つが見つけることができるファイルMasterViewController.m、含まれています

@synthesize detailViewController = _detailViewController; 
@synthesize fetchedResultsController = __fetchedResultsController; 
@synthesize managedObjectContext = __managedObjectContext; 

感謝を。

答えて

5

これはワームの小さな缶です。

アンダースコアは、主にインスタンス変数とアクセサー名を区別するために、@合成で使用されます。これは重要です。特に、アクセサーの変数にアクセスする以外にも(例:遅延初期設定)それらが同じ名前であれば、アクセッサメソッドを呼び出す "self.foo"を意味するときに、簡単に "foo"とタイプしてインスタンス変数を取得できます。だから、そういう意味でアンダースコアが使われています。

今、アップルはプライベートの方法の名前に先頭のアンダースコアを使用しないでください。彼らはプライベートメソッド名にその規約を使用し、意図せずに基本クラスメソッドの1つをオーバーライドする可能性があります。それはコンパイル時にこれを捕まえることができないため特に悪いことです。

しかし、プライベートインスタンス変数にアンダースコアを使用しても問題ないと言っています。実際、一例として、彼らは、特性を合成する際にイーバールのための先頭のアンダースコアを使用することは完全にOKです(そして示唆しています)。

今、ここにキャッチがあります。また、プライベートインスタンス変数には1つの先頭のアンダースコアも使用します。だから、あなたが同じ名前を持っていれば、葛藤があるかもしれません。これを見るには、View Controllerメソッドの実装では、 '_'で、どのようなコード補完があなたの方法をスローするのかを見てください。

なぜ、これらの名前付けの慣行を妨げないのですか?コンフリクトはコンパイル時に捕捉されるためです。同じ名前のインスタンス変数を2つ持つことはできません。そうしようとすると、エラーが発生します。

なぜ、コードテンプレートで二重下線付きの名前が生成されるのですか?知りません。 "実装"は実際には先頭の二重下線(大文字の後ろ)を予約しますが、__blockのようなObjCの追加があります。

私のお金のために、先頭の二重のアンダースコアで何も避けます。 Appleは生成されたコードで何でもできる。 FWIWでは、ARC用に生成されたコードの一部は、以前のARC以外のキーワードを参照しているため、生成されたコードをgospelとして使用しません。 FWIW、私は確かにではなく、がコアデータ用に生成されたコードを保持します。最低限で、あなたは(managedObjectContextアクセサメソッドで)変更する必要があります。

はさておき、私は人々が彼らのように先頭または末尾の文字としてドル記号を使用して見てきたよう

__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

__managedObjectContext = [[NSManagedObjectContext alloc] init]; 

私有合成名。

@synthesize foo = $foo; 
@synthesize bar = bar$; 

私は25年以上にわたり、C/C++を書いてきたが、私はにObjCにかなり新しいです、そしてそれは、独自の複雑さを持っています。だから、私は言語弁護士ではありません。私はパラリーガルでもない。私が知っているのは、それが合法的だと思われるということです。ドル記号が何か他のものに使われるべきではないとは確信できませんが、それは私が試したすべてに作用します。 Xcodeの構文ハイライターは、それを好きではありません(変数名の残りの部分には色付けされません)。

それはおそらく多くの質問に向かってあなたを上拍車をかけても私はあなたの答えをありがとうジョディ

+0

...、それは、あなたの質問に答えるために、あなたに十分なを与えた願っています - 私は実際にそれのほとんどは、私はすでに知っていたにもかかわらず、それを感謝。私はちょうどAppleがいくつかのivarsのために '_'と他の '__'のためにAppleが使っているのはちょっと不思議だった。あなたの答えは、私が必要な評判を得るときに役立つものとしてマークします。 –

+0

それは奇妙です - '$'は識別子の正当な文字ではないと考えられます(AFAIK、ルールは "plain"と同じです)。 Re: '__block'とその他のストレージ修飾子 - 実際は実装の一部です(clang/AppleのLLVM)。その場合、二重のアンダースコアが適切です。いい答え! –

+0

+1と約束しています。 Btw。私が最初に書いたように、MasterDetail Templateのケースではないことに気付きました。彼らはこの種の矛盾を他のテンプレートやクラス(AppDelegateでさえも)でも使用しています。 –

関連する問題