これまで私は変数名にアンダースコアを使うのを避けてきましたが、これは大学時代の Java 時代の名残かもしれません。そのため、Objective C でプロパティを定義するときは、自然にこれを行います。
// In the header
@interface Whatever
{
NSString *myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty;
しかし、ほとんどすべての例では、次のように行われます
// In the header
@interface Whatever
{
NSString *_myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty = _myStringProperty;
アンダースコアは唯一の方法なので、アンダースコアに対する嫌悪感を克服すべきでしょうか。このスタイルが好まれる理由はあるのでしょうか。
アップデート:最近の自動プロパティ合成では、@synthesizeを省略しても結果は同じになります。
@synthesize myStringProperty = _myStringProperty;
これは明らかに Apple の好みを示しています。それ以来、私は心配するのをやめて、アンダースコアを愛用するようになりました。
ベストアンサー1
私は常にアンダースコアを使用します。これにより、ローカル変数とインスタンス変数が明確に区別されます。また、次の状況でコンパイラの警告を回避できます。
@interface MyClass
{
NSString *name
}
@property (nonatomic, copy) NSString *name;
- (id) initWithName:(NSString *) name;
@end
@implementation MyClass
@synthesize name;
// The following method will result in a compiler warning
// (parameter name same as ivar name)
- (id) initWithName:(NSString *) name {
if (self = [super init]) {
self.name = name;
}
return self;
}
@end
編集:
反対票に耐え、コメントを読み終えた後、私の意見を述べてみたいと思います。
Apple は、ivars の名前をプロパティと同じにすることを推奨しています。また、プロパティは小文字で始めることを推奨しています。また、ローカル変数も小文字で始めることを推奨しています。
ここで問題が発生します。コードを読んで、使用されている変数を見つけたとき、命名規則では、この変数が ivar なのかローカル変数なのかを判断できないからです。これは困ったものです。解決策は、ivars とローカル変数に異なる命名規則を使用することです。これはまったくの常識です。
この命名規則を実装する方法は重要ではありません。本当に必要な場合は、ivar 名に「_WOOHAHA」を追加できます。私は気にしません (ただし、他の人は気にするかもしれません)。重要なのは、何をすべきかわかっている人々が、ivars に「アンダースコア プレフィックス」を使用することを決定したことです。私の意見では、たとえ彼らの会社が別のものを推奨していたとしても、彼らは正しい決定を下しました。(私が話している開発者とは、いくつかの主要な Apple フレームワークと .NET Framework クラスを書いている人たちです)
結局のところ、コードの品質は、それを説く人々さえも従わない愚かなルールに従うことよりも重要です。
あなたが示したコードに関するもう一つの注意点:決して使用しないでください保持文字列プロパティでは、コピーその代わり。
プロパティのコピー/保持の詳細については、以下を参照してください。