- 締切済み
xcode インスタンス変数について
iPhone SDKで開発を始めました、超初心者です。 xcode でインスタンス変数を、別のオブジェクトで参照したいのですが、 いろいろ試しましたが、どれもうまくいきません。 もっとも簡単な参照方法をご教授戴けると助かります。 参照したい変数は、String型です。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- harawo
- ベストアンサー率58% (3742/6450)
> どうしても、NSString *string = [myObject stringValue]; > の箇所で、呼び出し元オブジェクト may not respond to "+stringValue"となってしまいます。 エラーメッセージ文中「+stringValue」は、インスタンスメソッドではなく、クラスメソッドとして、「stringValue」が(コンパイラに)解釈されていることを意味しています。「- (NSString *)stringValue」がインスタンスメソッド、「+ (NSString *)stringValue」がクラスメソッドです。プラス・マイナス記号でこのふたつが区別されます。 「stringValue」がクラスメソッドと、コンパイラに解釈されているのだとすると、「myObject」をインスタンス名でなく、クラス名と定義している箇所が、どこかにあるのではありませんか? ※Objective-Cでは、クラス名を大文字で始め、インスタンス名を小文字で始めるという規則があります。そのような書き分けをしなくても、コンパイルは通りますが、今回の件のように、人間が間違ってしまうことを予防するメリットがあります。 どういうことかというと、プロパティ「stringValue」の定義が間違っている、不完全である、スペルミスなどの、かんたんなミスがあるなどがトラブルの原因であろうと思われます。 「どうしても」という表現は、ほんとうに「どうしても」のときにだけ使うべきでしょうね。三日三晩、ろくに寝ることもできずに、プログラムが正常に動かない原因を調べても、まったくつきとめられずに、精根尽き果てたあげく、4日目の朝に、1文字スペルミスを発見したなどという経験は、ほとんどすべてのプログラマが経験していることではないでしょうか? 私は、数千円するObjective-C解説書、iOS開発入門書に代わるものを、ここで無償で提供するつもりは、毛頭ありません。(書籍購入費以上の報酬をもらえるなら、いくらでもお教えしますがね) プロパティの定義のしかたは、ちゃんと説明している書籍なら、過不足なく解説しているはずです。iOS開発を目指しているプログラマのブログなどでも、ちゃんとした解説をしているものもあるでしょう。まずあなたが書いたプロパティの定義を、検証しなおしてみましょう。
- harawo
- ベストアンサー率58% (3742/6450)
> ひとつご質問ですが、 じぶんの質問に「ご」をつけるのは、やめたほうがいいですよ。「おれさま」「てめえども」といっているのに等しいですからね。 回答No.1の例示で使った、「myObject」は、プロパティ「stringValue」を定義したクラスのインスタンスのことです。 「外部」とは、そのオブジェクト以外のオブジェクト(インスタンス)のことです。
お礼
ありがとうございます。 どうしても、NSString *string = [myObject stringValue]; の箇所で、呼び出し元オブジェクト may not respond to "+stringValue"となってしまいます。
- harawo
- ベストアンサー率58% (3742/6450)
あるインスタンスのインスタンス変数を、外部から直接参照する方法はありますが、アクセッサ(アクセサ)メソッド、あるいはプロパティを使って参照するのが、一般的です。 ※Objective-C、とくにiOSのフレームワークをベースにしている場合、「String」型は一般的でありません。「NSString」型を使ってください。 インスタンス変数「NSString *stringValue」を、アクセッサメソッドを使って参照するには、つぎのふたつのメソッドを定義します。それぞれ「ゲッター」(Getter)、「セッター」(Setter)と呼びます。 - (NSString *)stringValue { return stringValue; } - (void)setStringValue: (NSString *)value { stringValue = value; } プロパティは、アクセッサメソッドをオートマティックに生成するようにしたもので、Objective-C 2.0より新設されました。 @propertty (retain) NSString *stringValue; とインターフェイス部で宣言し、実装部で、 @synthesize stringValue; と1行記述すると、ゲッター、セッターふたつのアクセッサメソッドが生成されます。 じっさいに外部から参照するコードは、 NSString *string = [myObject stringValue]; [myObject setString: string]; で行いますが、ドットでインスタンス名とプロパティ名を連結して、 NSString *string = myObject.stringValue; myObject.stringValue = string; とすることもできます。 (C言語の構造体の要素参照と似ているため、混同しないよう注意が必要です。ときどきコンパイラが誤判断することもあります(苦笑))
お礼
大変、初心者でねわかれやすいご回答戴き、本当にありがとうございます。 ひとつご質問ですが、myObjectとは、stringValue を宣言するクラス名、 そしい外部からというのは、別のオプジェクトでよろしいでしょうか? 大変呆れた質問で、すいません。
お礼
ありがとうございました。 あれから、いろいろ試しまして、もう少しの所で、止まってしまいました。 ご教授戴き、ありがとうございました。