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


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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/05/03 14:19:01
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taroe No.3

回答回数1099ベストアンサー獲得回数132

ポイント60pt

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

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


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

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

id:weed_7777

リンク先のページで
@synthesize param = _param
とやっているのを見てピンときました。

XcodeのInterface Builderでアウトレットを設定すると
自動的に実装ファイルに下記のようなコードが書き込まれていました。
@synthesize param = _param

Xcodeが配慮してくれていたんですね。
納得です。

2012/05/03 14:16:00

その他の回答2件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント20pt

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

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:
  ...
インスタンス変数には直接アクセスすべきでなく、アクセサメソッドを使うべきであり、それを分かりやすくするために、インスタンス変数を_(アンダースコア)で始めるようにと明記してくれていました。

id:weed_7777

なるほど、そういう流儀なんですね。
教えていただいてありがとうございます。

2012/05/03 14:16:51
id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ポイント20pt

ざっと探して見ましたが、文法上、アンダースコア(_)に特別な意味はないようです。
ただ、よくある命名則として、プライベートだとかローカルだとかそれに類する意味を持たせる事が多いです。
なので、『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
とか
色々ありますね。

id:weed_7777

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

2012/05/03 14:18:11
id:taroe No.3

回答回数1099ベストアンサー獲得回数132ここでベストアンサー

ポイント60pt

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

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


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

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

id:weed_7777

リンク先のページで
@synthesize param = _param
とやっているのを見てピンときました。

XcodeのInterface Builderでアウトレットを設定すると
自動的に実装ファイルに下記のようなコードが書き込まれていました。
@synthesize param = _param

Xcodeが配慮してくれていたんですね。
納得です。

2012/05/03 14:16:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません