【iPhoneアプリ】init(イニシャライザ)を用いた初期化について
今回は「init(イニシャライザ)」についてです。
Javaを経験されている方なら、気づいていると思いますが
通常、インスタンスを行う際に「コンストラクタ」という初期化処理を行います。
その部分から記載させて頂きます。
コンストラクタについて
コンストラクタとは、インスタンス時に必ず初回に処理されるメソッドの事です。
通常は、以下のようにコンストラクタを作成し、
中身は何も書かないです。
public class Object { private int itemA; public int itemB; //コンストラクタ Object () { //空のコンストラクタ } //クラス名と同じ名前のメソッドを作成します。 }
ですが、インスタンス変数などクラスを利用する前に
初期化処理が必要な場合は、以下のように処理を記載します。
public class Object { private String itemA; public String itemB; //コンストラクタ Object () { itemA = "初期化A"; itemB = "初期化B"; } //クラス名と同じ名前のメソッドを作成します。 }
また、コンストラクタに引数を追加し、引数の値で初期化することも可能です。
public class Object { private String itemA; public String itemB //コンストラクタ Object (String A, String B) { itemA = A; itemB = B; } //クラス名と同じ名前のメソッドを作成します。 }
では、Object-cではどうでしょう。
Objectiv-cの初期化について
このようにJavaでは、コンストラクタを用いて初期化を行うのですが
Objectiv-cにはコンストラクターがありません。
その代わりに「init」イニシャライザがあります。
インスタンス時に記載しているコレです。
Object obj = [[Object alloc] init];
この宣言を行う事により、コンストラクタと同じ初期化を
行う事が出来ます。
クラスの実装例は以下の通りです。
モデルファイル
■Initialize.m
//イニシャライザ - (id)init { if((self = [super init])) { NSLog(@"初期化処理"); } return self; }
その他利用方法について
オーバライドを使うとにより、引数ありの初期化も可能となり
複数のイニシャライザもオーバーライドできます。
以下のソースが主な使い方になります。
ヘッダーファイル
■Initialize.h
@interface Initializer : NSObject //オリジナルのイニシャライザの定義 -(id)initWithTitle:(NSString *)aTitle date:(NSDate *)aDate; -(id)initWithTitle:(NSString *)aTitle; @end
また、以下のソースのように、引数をすべて明示的に指定する「initWithTitle」は
クラスで最も重要なイニシャライザで「指定イニシャライザ」といいます。
※Apple Developer CoCoaEncyclopedia.pdfより
モデルファイル
■Initialize.m
#import "Initializer.h" @implementation Initializer //指定イニシャライザ -(id)initWithTitle:(NSString *)aTitle date:(NSDate *)aDate{ if((self = [super init])) { NSLog(@"タイトル:%@ 日時:%@",aTitle,aDate); } return self; } //副次的イニシャライザ(引数あり) - (id)initWithTitle:(NSString *)aTitle { return [self initWithTitle:aTitle date:[NSDate date]]; } //副次的イニシャライザ(引数なし) - (id)init { return [self initWithTitle:@"引数なし"]; } @end
このように設定を行ったイニシャライザを以下のプログラムで実行します。
メインファイル
■ViewController.m
//指定イニシャライザ Initializer *Init1 = [[Initializer alloc] init]; //副次的イニシャライザ(引数あり) Initializer *Init2 = [[Initializer alloc] initWithTitle:@"引数あり"]; //副次的イニシャライザ(引数なし) Initializer *Init3 = [[Initializer alloc] initWithTitle:@"引数あり2個" date:[NSDate date]];
また、これらはNSObjectを基準としたイニシャライザの為
他のクラスのイニシャライザはAppleのdeveloperをご確認ください。
https://developer.apple.com/jp/devcenter/ios/library/japanese.html