• ベストアンサー

obj-c @synthesizeについて

Objective-Cの入門書を読み進めているのですが、クラスを使いやすくするために、アクセサメソッド(ゲッターメソッド、セッターメソッド)を省略してプロパティを設定する、という事が書かれています。 プロパティ化した変数はインプリメントセクションで、必ず @synthesize と共に記述しなければならない、と覚えてしまってよいのでしょうか? @synthesizeがでてきたら、「あ、これはプロパティなんだな。インターフェースセクションで@property されてるな」と理解してしまってOKでしょうか? お詳しい方、よろしければご回答お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> プロパティ化した変数はインプリメントセクションで、必ず @synthesize と共に記述しなければならない、と覚えてしまってよいのでしょうか? アクセッサメソッドを記述すれば、@synthesizeは、記述しなくてもかまいません。@synthesizeを記述すると、アクセッサメソッドを省略できると考えるのが、妥当です。 > @synthesizeがでてきたら、「あ、これはプロパティなんだな。インターフェースセクションで@property されてるな」と理解してしまってOKでしょうか? これは、そのとおりです。

michael_u
質問者

お礼

どうもありがとうございます。

その他の回答 (1)

回答No.1

>プロパティ化した変数はインプリメントセクションで、必ず @synthesize と共に記述しなければならない、と覚えてしまってよいのでしょうか? それはちょっと違うと思います。 http://developer.apple.com/jp/documentation/cocoa/conceptual/objectivec/Articles/chapter_5_section_3.html の「プロパティの実装ディレクティブ」の「重要」と書かれたところを参照してください、 と言いたいところですが、日本語訳がちょっとおかしいので、原文を参照した方が良さそうです。 Mac OS X Developer Library http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1 iOS Developer Library http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1 ( Mac OS X Developer Library のものと iOS Developer Library のものは、内容は同じなんじゃないかなと思います。) 日本語訳には「デフォルト値は@dynamicです。」と書かれています(ここだけ見ると @synthesize も @dynamic もなければ @dynamic とみなされるのかと思ってしまいます・・・)が、原文には「デフォルト値は@dynamicです。」にあたる記述は見当たりません。

michael_u
質問者

お礼

ありがとうございます。マニュアルの参照の仕方もままならない段階でして、リンクとても助かります。

関連するQ&A

  • バウンドプロパティとは?

    お世話になります。 java.beans.PropertyChangeEventのAPIを見ると、 PropertyChange イベントは、Bean が「バウンド」プロパティーまたは「制約」プロパティーを変更するたびに送信されます。 というような記述があるのですが、この「「バウンド」プロパティー」とは何のことを指しているのでしょうか? Javaでプロパティといえば、クラスの中に定義される、アクセサメソッド(ゲッター・セッター)を使ってのみアクセスできるprivateな変数メンバのことだと思うのですが、「バウンド」プロパティとはそれのことですか?それとは別の何かですか? よろしくご教授ください。

    • ベストアンサー
    • Java
  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • セッターとゲッター

    Java初心者です。 セッターとゲッターの違いがわからないので質問します。 あるクラスの配列に値を格納して、もうひとつのクラスでそれを取得するにはセッターとゲッターのどちらに記述すればいいですか? また、ソースの書き方としてはどのように記述すればいいでしょうか?お願い致します。

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • C++で外部メソッド呼出をReadonlyにしたい

    C++で、外部からメソッド変数を読み込み専用で使いたいです。 class Test { private: char ro[32]; Test(){ strcpy(ro, "hello world"); } }; // 何かの仕組み(C++のテンプレートを良く知りませんが可能でしょうか?) Test a; printf("%s\n", a.ro); // OK strcpy(a.ro, "hoge"); // OUT // Objective-Cみたいな // @property (readonly) char *ro; // @synthesize ro; // のようにして、リードオンリーだけアクセスできる g++でコンパイルして、動作確認できるサンプルがあると助かります。

  • Beanの連携(?)について質問です

    Beanの連携(?)について質問です 例えば 社員名テーブルと給与テーブルがあったとします。 社員名テーブルと給与テーブルは社員コードでつながっているとします。 社員テーブルへのデータ取得・登録・削除などを行うEmployeeBeanクラスと 給与テーブルへのデータ取得・登録・削除などを行うPaymentBeanクラスがあります。 つまりそれぞれのBeanにはセッター、ゲッター、メソッドがあるということです。 画面からは社員一覧・登録・変更・削除ができます。 給与テーブルも給与一覧・登録・変更・削除ができます。 共通するメソッド(一覧・登録・変更など)もありますが、共通しないメソッド(検索など)もあります 「社員テーブルと給与テーブルを社員コードでつなげた一覧」を表示する場合はどうすれば よいかで詰まってしまいました。 「社員テーブルと給与テーブルを社員コードでつなげた一覧」を取得するBeanクラスを 作ればできたのですが・・・・EmployeeBeanとPaymentBeanのプロパティ、セッター、ゲッターを このBeanクラスでも定義しないといけないのはなんとも芸がないといいますか… どうすればスマートなソースになるのかご指導お願いします!!

    • ベストアンサー
    • Java
  • 継承したメソッドのドキュメンテーションコメント

    C#の開発を始めて日が浅いため、現場におけるお作法がわかりません。 現場におけるクラス・インターフェースを継承したメソッドのドキュメンテーションコメントの付け方に関する一般論についてお教えいただきたいです。 ※基底クラス、及びインターフェースの抽象メソッドにはドキュメンテーションコメントの記述がある物とします。 ※普段はJavaを使っている為、そこから引用している書いている部分があります。ご容赦下さい。 ・抽象クラスにおけるインターフェースから継承した抽象メソッド(実装しない場合) Javaとは違い、抽象クラスであってもインターフェースが持つの抽象メソッドを無視する事はできず、 public abstract修飾子を付けて抽象メソッドを定義してやる必要があるようなのですが、 この場合、ドキュメンテーションコメントは省略すべきでしょうか? それとも、何かしら記述するべきなのでしょうか?(Javaで言うところの@inheritDoc等・・・そのような物があるかはわかりませんが) ・新たに実装を行う場合(抽象メソッドの実装等) 省略すべきでしょうか? ・既存の実装を拡張し、変更の影響は微小かつメソッド内のみで完結し、概要やその他のメソッドの責任において表記すべき内容に変化が無い場合 省略すべきでしょうか? ・既存の実装を拡張し、想定される例外の追加等、メソッド外にも影響を及ぼす大きな変更が入った場合 新たに完全なドキュメンテーションコメントを作成するべきでしょうか? それとも差分以外は新たに作成すべきではないのでしょうか? 一般論と言っても規模や進め方によって様々だとは思いますが、 通念的に「心がけていくべき事」等あれば、是非お教え下さい。 最後に、この質問の趣旨からは外れるのですが、一つ追加で別の質問をさせてください。 私は何故抽象クラスがインターフェースの抽象メソッドを無視できないかがわかっておりません。 (インターフェース-インターフェース、抽象クラス-抽象クラスは無視できるのに) 敢えて明示的に定義を強要させている以上、何か理由あっての事だと思いますが、 それがわからず悶々村々としながら作業しております。 その理由をお教えいただけませんでしょうか。 宜しくお願い致します。

  • アノテーションを利用したアクセサメソッドの自動定義というのは実現可能?

    近年、デフォルトコンストラクタと各フィールドに対するアクセサメソッド(setter/getter)を備えたJavaBeansが話題になっていると思います。例えばこんなクラス。 class TestBeans {  private int number;  public void setNumber(int number) {   this.number = number;  }  public int getNumber() {   return number;  } } しかし、フィールドの数が増えてくると、コードがどんどん冗長になってくると思います。 そこで、ふと思ったのですが、リフレクションとJDK5のアノテーションを使って、下記のようにスッキリとアクセサメソッドが利用できるようになったりしないかなぁ、と。 class TestBeans {  @Getter @Setter  private int number; } こうすることによって、getNumber / setNumber が利用できるようになったりしないかな、ということです。 アノテーションの自作やリフレクションに関する知識が乏しいので、私にはよくわかりませんでした。 こういったことは実現可能なのでしょうか? また可能ならばどのように実装するのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう