人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Objective-Cで.hファイルで定義した変数を.mファイルで先頭に「_」(アンダーバー)を付けて使っているのを見かけるのですが、これはどういう意味があるんでしょうか?

教えて君で申し訳ないのですが、どうぞよろしくお願いします。

●質問者: Tats
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● a-kuma3
●20ポイント

インスタンス変数(メンバ変数)ですよね、それ。

Objective-C だけじゃなく、c++ でも、そういう流儀があります。
ソースの一部を見ただけ(宣言部を見なくても)で、どういう意図で使われているのかを分かりやすくするため、という意味があります。

Objective-C の場合には、流儀と言うよりも、もうちょっと強い縛りを持つようです。
http://www.awaresoft.jp/ios-dev/item/115-ivar-naming-convention.html

To help to signal this, prefix instance variable names with an underscore (_), for example:
...
インスタンス変数には直接アクセスすべきでなく、アクセサメソッドを使うべきであり、それを分かりやすくするために、インスタンス変数を_(アンダースコア)で始めるようにと明記してくれていました。


Tatsさんのコメント
なるほど、そういう流儀なんですね。 教えていただいてありがとうございます。

2 ● TransFreeBSD
●20ポイント

ざっと探して見ましたが、文法上、アンダースコア(_)に特別な意味はないようです。
ただ、よくある命名則として、プライベートだとかローカルだとかそれに類する意味を持たせる事が多いです。
なので、『Objective-Cで.hファイルで定義した変数を.mファイルで先頭に「_」(アンダーバー)を付けて使っている』ということそのものはないですが、下記の件の事なのではないかと思いました。
//具体例見てないんで、こういうのとは別に、単にアンダーバー付けた識別子を使ってるという事もあるとは思います。
http://www.awaresoft.jp/ios-dev/item/115-ivar-naming-convention.html

プロパティに対応するインスタンス変数の変数名をプロパティ名と別にすべきか、また、インスタンス変数名をアンダースコア(_)で始めるべきかどうか、さまざまな場所で議論になっている

ただ別の流儀もあって

_で始めるべきではないという主張では、AppleがCoding Guidelines for Cocoaで、「変数名は小文字で始めるべき」「AppleはCocoaのフレームワークでプライベートメソッドを_で始めるようにしているので、メソッド名は_で始めるべきではない」としていることを根拠として挙げられるようです。(これについては下の補足をご覧ください。)

とか

ネットで検索すると、アンダースコアを付けることは勧めない(好みじゃないとか、それは古いやり方だとか)という人もいる。

http://www.smallmake.com/wp/?p=798
とか

命名規則

プロパティに対応するインスタンス変数名は、アンダースコア(_)で終わらなければなりません。プロパティ名は、対応するインスタンス変数名から最後のアンダースコア(_)を取り除いたものにするべきです。

http://kyykblog.blogspot.jp/2010/11/blog-post_15.html
とか

http://tsurumura-seisakusho.blogspot.jp/2012/03/objective-c.html
とか
色々ありますね。


Tatsさんのコメント
ははあ、いろいろな流儀があるんですね。 勉強になります。 教えていただいてありがとうございます。

3 ● taroe
●60ポイント ベストアンサー

Objective-C: インスタンス変数のアンダースコアについて
http://www.smallmake.com/wp/?p=798

インスタンス変数にアンダースコアを付けることで、ローカル変数と見分けやすくするという手法がある。


文法上、言語上は意味はない。
あとはネーミングルールの問題です。

インスタンス変数を直に参照するのはやめてくれという意思表示程度です。


Tatsさんのコメント
リンク先のページで @synthesize param = _param とやっているのを見てピンときました。 XcodeのInterface Builderでアウトレットを設定すると 自動的に実装ファイルに下記のようなコードが書き込まれていました。 @synthesize param = _param Xcodeが配慮してくれていたんですね。 納得です。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ