それにしても、「
@publicにして自由に使えるようにする」というのは、いくらなんでも無防備すぎる感じもしますね。また、
->を使ってアクセスするというのも、どうも
Objective-Cらしくない感じがします。もう少し
Objective-Cらしい、スマートなアプローチが欲しいところです。
そう思う人には、「
プロパティ」の利用が一番でしょう。
プロパティは、インスタンス変数にアクセスする手段を提供する非常にスマートな方法です。これは、いってみれば「アクセス用メソッドの自動実装機能」です。
先に、インスタンス変数にアクセスをするのに、値の取得と変更のためのメソッドを用意していましたが、プロパティはこれらのメソッドを自動生成し、ただインスタンス変数を用意するだけで、メソッド経由でこれにアクセスできるようにします。
このプロパティは、いくつか記述を用意しなければいけません。まず
@interface内で以下のように宣言を記述しておきます。
@property ( 属性 ) タイプ プロパティ名;
@propertyというのもコンパイラディレクティブの一種で、指定のプロパティを用意する働きがあります。その後に、プロパティの性質を示す属性を()で記述し、それから変数の宣言などと同じようにタイプと名前を記述します。
このとき、プロパティの名前は、インスタンス変数と同じ名前にしておきましょう。違う名前でもプロパティは作成できますが、そのための指定が必要なのと、わざわざ別名で用意するのは混乱のもとですから……。
プロパティを用意すると、
Objective-Cは何も言わなくても同じ名前のインスタンス変数にアクセスするためのメソッドを用意するようになっていますので、名前は揃えたほうが扱いやすいのです。
問題は、「
属性」でしょう。ここにどういうものが用意できるかというと、ざっと以下のようなものが入ります。
retain――オブジェクトを保持している
assign――オブジェクトを参照している
copy――オブジェクトをコピーして保持する
readwrite――値の読み書きが出来る(デフォルトではこれを設定)
readonly――値の読み取りのみ、書き換えはできない
getter=メソッド名――値を取得するメソッド名
setter=メソッド名――値を変更するメソッド名
プロパティとして設定されるオブジェクトの保管に関するもの、読み書きのアクセス権に関するもの、そして生成されるメソッド名に関するものがあります。もちろん、一切指定しなくてもプロパティを生成することはできます。
こうして
@interface側に
@propertyを用意したら、次に
@implementation側に以下のような形でプロパティの指定を記述しておきます。
@synthesize プロパティ名;
これで、指定したプロパティが作成され、プロパティ名と同じ名前のインスタンス変数にアクセスするためのメソッドが自動生成されます。もし、インスタンス変数と別の名前のプロパティを用意したい場合は、以下のようにして変数名を指定してください。
@synthesize プロパティ名 = インスタンス変数;
これで、プロパティが用意され、自動生成されたメソッド経由でインスタンス変数が利用可能になります。