2012年2月1日水曜日

objective-Cのお勉強「アクセサメソッドをマスター」


今回は、先ほどのインスタンス変数に引き続き、
アクセサメソッドについてお勉強したいと思います。

アクセスメソッドってなんだ!!と思いますが、
先ほどに引き続き、
「HelloWorldAppDelegate.h」に書いてある、ここのことです。

@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) MyViewController *myViewController;

あと、
「HelloWorldAppDelegate.m」に書いてある、ここのことです。

@synthesize window;
@synthesize myViewController;

これ、よく見るとwindowやmyViewControllerが一緒だったり、
なんか似ている感じしますよね??

そうです、これは二つで一つの役割があるからです。

なんで二個必要なのかというと、
●セッターメソッド(インスタンス変数にデータを格納するメソッド)
●ゲッターメソッド(インスタンス変数からデータを取得するメソッド)
という二つのメソッドが用意されており、
この二つのメソッドのことをあわせてアクセサメソッドなのです。

本当なら、アクセサメソッドの書き方を説明するとことなのですが、
Objective-C 2.0という現在のObjective-Cでは、
アクセサメソッドを自動生成してくれるコンパイラディレクティブが用意されているので、
今回はそちらのご紹介をしたいと思います。

アクセサメソッドを自動生成してくれるコンパイラディレクティブというのはこれ。

宣言部分に「@property」
実装部分に「@synthesize」
を書いておくと、実行時に自動的にアクセサメソッドを生成してくれます。

@synthesizeの方は簡単そうなので、
@property (nonatomic, retain) UIWindow *window;
の方から見ていきたいと思います。

@property (nonatomic, retain) UIWindow *window;
@property(インスタンス変数の取り扱い方)型 変数名;

インスタンス変数の取り扱い方ってなんだろうと思いますが、

nonatomic

複数のスレッドから同時に読み込まれたら、動作保証しないよ。
アトミックのままでも便利でいいけど、頻繁に使ってると、
パフォーマンスが大変なことになっちゃうよ。
という意味らしい。(まだまだ勉強しないといけないですね、、)

retain

これから自分が使うから、勝手に解放しちゃいけないよ。
という意味らしい。

他にも、こんなものがあります。

readonly:取得のみ可能
readwrite:取得/格納可能
assign:格納時は単純代入して
copy:格納時にオブジェクトのコピーを使って

カンマの区切りは、ただの区切りなだけで、
必ず二つ書かないといけないものではありません。

0 件のコメント:

コメントを投稿