2011-08-24 5 views
14

可能性の重複する前に、なぜ "_" アンダースコアを置く:客観CIで
How does an underscore in front of a variable in a cocoa objective-c class work?Objective Cの中の変数名

は、例えば_someVariable

変数名の前にアンダースコアを使用してコードの多くを見ています

なぜですか?どのようにしてアクセッサを書くか、つまりそのような変数のメソッドを取得して設定する方法もあります。

+0

upvoting私は標準の命名規則のすべての種類に精通しなければならないと感じているので。 – amod

答えて

6

変数がのインスタンス変数であることを示すためにアンダースコアがよく使用されます。 ivarsは、プロパティとそのアクセサと同じ名前を持つことができるため、実際には必要ありません。

例:

@interface MyClass : NSObject { 
    NSString *_myIVar;     // can be omitted, see rest of text 
} 
// accessors, first one is getter, second one is setter 
- (NSString *) myIVar;     // can be omitted, see rest of text 
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text 

// other methods 

@property (nonatomic, copy) NSString *myIVar; 

@end 

さて、代わりにアクセサmyIVarsetMyIVar:自分自身を宣言し、コーディングの、あなたはコンパイラがそれをやらせることができます。新しいバージョンでは、インターフェイスにmyIVarを宣言する必要はありません。プロパティを宣言し、コンパイラに残りの部分を合成させます。 .mファイルでは、実行します。あなたはゲッターやセッターのデフォルトの実装以上のことを行いたい場合は、

- (void) dealloc { 
    [myIVar release]; 
    [super dealloc]; 
} 

FWIWあなたがすることができます

@implementation MyClass 
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you, 
        // with proper code. 
        // also generates the instance variable myIVar 

// etc... 

@end 

文字列を確定してくださいそれらの一方または両方をあなた自身がまだコードしていますが、メモリ管理の面倒を見なければなりません。その場合、コンパイラはその特定のアクセサをもう生成しません(ただし、一方のみを手動で実行すると、もう一方は引き続き生成されます)。

あなたは

myString = self.myIVar; 

または、別のクラスからなどのプロパティにアクセスする:あなたはself.を省略した場合はMyClassで

theString = otherClass.myIVar; 

otherClass.myIVar = @"Hello, world!"; 

、あなたは裸を取得ivar。これは一般に初期化子とdeallocでのみ使用されます。

+0

例が正確に私が見ていたものなので、素晴らしいexaplainationと受け入れていただきありがとうございます。 –

6

しないでください。

単一の先頭のアンダースコアは、アップルの内部コード規約です。彼らはあなたのivarの名前があなたと衝突しないようにそれを行います。 ivarの名前に接頭辞を使用する場合は、以外にはの1つのアンダースコアを使用します。

+0

私は、アクセサーの代わりに生のivarsを誤って使用することを避けるためにそれを使用する人もいると思いますか? – andyvn22

+1

素晴らしいexaplaination –

+0

'__variable'(2つのアンダースコア)は、危険な内部を意味しますか?私は内部メソッドのコンベンションを知っていましたが、私はAppleライブラリに深く入るまで、これらのメソッドを見たことがありません – Sirens

0

このクラスではuが、これは命名規則で

private: 
int __x; 

public: 
int GetX() 
{ 
    return this.__x; 
} 

を有することができるようにプライベート

であるインスタンス変数を定義する++、通常のCのために使用される命名規則で、私は中に使用することを余儀なくされましたC++。しかし私の先生は命名規則の名前を教えてくれませんでした。しかし、私はこれが有用であり、特にJava命名規約を使用していないときには読みやすいと感じています。

+0

ありがとう、あなたに素晴らしいexaplaination +1 –

+0

JavaとObjective-Cは2つの異なる言語です。あなたはそれをJavaで行うことができるからといって、Objective-Cで行うべきであると仮定しないでください。 – SevenBits

+0

@SevenBits私はあなたが私の答えを正しく読まなかったと思います。私は彼らが通常はあなたの変数を読めるように言いました。第2に、Java開発者は通常、可読性を達成するためにcamelCase表記法に従います。それを投票する前に、正しい答えをお読みください。 – amod

関連する問題