クラスの初期化(イニシャライザ)

更新日 2010-12-16 (木) 10:52:33

オブジェクトの生成

オブジレクと作成には[SomeClass new] と [[SomeClass alloc] init]があるが、
同じことだが、Cocoaでは[[SomeClass alloc] init]を使用する習慣がある

クラスの初期化

クラスの初期化もメソッドとして定義する。そのときメソッド名は「init」または、initで始まるメソッド名で指定するのが通例のようだ。たとえば「initName」など。

もし、初期化メソッドが呼ばれたときそのクラスに初期化メソッドが定義されていない場合はそのスーパークラスの初期化メソッドが呼ばれる。

常とう句

-(id)init
{
    self = [super init];
    if( self != nil){
       (処理を記入)
    }
    return(self);
}
  • initの戻りはオブジェクト型でid
  • イニシャライザが定義してあるので、スーパークラスが自動でイニシャライザされなので呼び出し、成功すれば自分自身もイニシャライズする。
  • selfは自分自身のクラスを参照する値。

サンプルでNSObjectは初期しても実はなにも行わないようである

サンプル

#import <Foundation/Foundation.h>
// クラスの初期化
 
@interface HCare : NSObject
{
        NSString *name;
        double height,weight,mbi;
}

// 初期化メソッドを指定
-(id) init;

(略) 
 
@end

@implementation HCare

//このクラスのinitが定義されていないときはスーパークラスの初期化のみを行う
-(id) init
{
        self =[super init];
        //スーパークラスを初期化できない場合はnil帰るのでこのクラスの初期は行わないでnilを返す
        //スーパークラスが初期化できたときだけ初期化が完成できる
        if(self != nil){
                name =@"No Name";
                height = -1;
                weight = -1;
        }
        return(self);
}

(略)

@end

int main (int argc, const char * argv[]) {

        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        HCare *myself;
        myself =[[HCare alloc] init];

(略)

        [pool drain];

        return 0;

}

指定イニシャライザ

複数のイニシャライザがあるとき、メインになるイニシャライザを指定イニシャライザという。下のように仮にinitにメッセージを送っても指定イニシャライザが呼ばれる。

@interface HCare : NSObject

-(id) init;
-(id) initName:(NSString *) name;

@end

@implementation HCare;

//指定イニシャライザ
-(id) initName:(NSString *) n
{
     self = [super init];
     if (self != nil){
          n = name;
     }
     return(self);
}

-(id) init
{
     self = [self initName:@"None"];
     return(self);
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-12-16 (木) 10:52:33 (3957d)