では実装をみてみましょう。
4行目、初期化したインスタンスをメッセージ送信側に返すために戻り値が「id」型となっています。
5行目では「self = [super init]」という処理が入っています。まずここで出てきた「self」というのは
自分自身のインスタンスを表す変数となっています。そして「super」はこのクラスが継承しているクラス(親クラス)を指しています。
つまり「self」は「Person自身のインスタンス」を表し「super」は「Objectクラス」を表しています。
継承はまたのちにでてきます。
6行目以降では処理としては親クラスの初期化を行い、残りの部分の処理を続けて記述する形となります。
その時の注意点として初期化に失敗した場合、そのまま次の処理に進んではまずいので6行目のところでチェックをしています。
ここで「nil」というのが新たにでてきました。これはid型への参照が無いという意味となります。
初期化処理に失敗してid型の参照がなければ、以後の処理をしないということになります。
成功した場合は7、8行目の処理となります。とりあえず日本人男性の平均的な体重と身長を設定しています。
「main.m」のほうは呼び出しているだけですね。前回の入れ子にあったように「alloc」してメモリ確保したのち
initを呼び出して初期化しています。
ただ、これではオブジェクトが作成されるたびに同じ値ばかりで初期化されるため、
呼び出す側から値を指定したい場合は、どうすればよいのか。
まず今までに出てきたものでやるならセッターを使用する形となりますが、
インスタンス化と同時に初期値も設定したいと思うことがあるでしょう。そのときは新たにメソッドを定義することに
なります。
その時のメソッド名は初期化用であることを示すため「initWith~」という名前にしておきます。
今回の場合はこんな感じでしょうか。
Person.hファイル
-(id)initWithWeight:(double)personWeigth height:(double)personHeight;
Person.mファイル
-(id)initWithWeight:(double)personWeight height:(double)personHeight{ self = [super init]; if(self != nil){ weight = personWeight; height = personHeight; } return self; }
main.mファイル
id mine = [[Person alloc] initWithWeight:65.0 height:1.72];
これで初期化ができます。
今回のまとめとしては
- インスタンス変数は何もしないと0で初期化される
- 0以外で初期化を行いたい場合は「init」メソッドをオーバライドして処理する
- id型の参照がない場合(オブジェクトとして無効)は「nil」というもので表される
- 自分自身を表す「self」と親クラスを表す「super」が用意されている
- 親クラスの持つメソッドを上書きしてする再定義することを「override」という
- インスタンス化と同時に初期値の設定をしたい場合、「initWith~」というメソッドを作成する
といったとことでしょうか。
TechProjin 開発系基礎講座 連載リンク
基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載
AIなどで注目急上昇!これから学ぶならPython!!
独学で学ぶ-pythonプログラミング 連載
汎用性◎ 定番プログラミング言語JAVA
Java基礎講座 連載