2011-03-12 14 views
1

免責事項、私は目的Cを初めて使いましたが、これは説明できません。それでは、私が持っているとしましょう目的C init

- (id)init { 

    if ([super init]) { 
    return self; 
    } else { 
    return nill; 
    } 

} 

- (id)init { 
    if (self = [super init]) { 
     // do your init business here 
    } 
    return self; 
} 

myObj = [[MyObject alloc] init]; 

MyObjectにクラスはNSObjectののサブクラスである場合、私は、initを実装する二つの方法を見てきました。 2番目の例では、initはNSObjectの初期化されたバージョンを返しませんか?だから、myObjは...それが何であるかをどのように知るだろうか?それはMyObjectではなくNSObjectだとは思いませんか?

答えて

3

1)最初のバージョンは間違っています。 selfは、superイニシャライザによって返される値で常に割り当てられる必要があります。init<...>superであるため、初期化時に別のオブジェクトを返すことがあります(これは珍しいことではありません)。 2番目のバージョンは、実際にはinit<...>メソッドを実装するための「公式の」方法です。

2)「MyObjectではなくNSObjectだとは思わないでしょう」 myObj のインスタンス 'NSObject' のインスタンス 'MyObject'です。それは継承の全ポイントです。

+0

右、分かります。私はそれが何をしているのか知っていることを意味私はちょうどボンネットの下で、どのようにそれを知ってほしい。 NSObjectクラスのオブジェクトにはMyObjectクラスのオブジェクトとなるプロパティやメソッドがありません。 NSObjectのinitがNSObjectを返すことが期待されます。構文的に、それは私を混乱させる。 – scriptThis

+0

-initは、NSObject *ではなくidを返します。 – NSResponder

+0

@scriptThis:そうです。しかし、 'alloc'オブジェクトを生成するのは' init'ではありません。 – hoha

1

私はちょうどそれがどのようにそれを行うのかを知りたいです。

かなり簡単です。 までのすべてのクラスの99.9%は、の書き込みは、ある方法でNSObjectから継承されます。イニシャライザでは、superの指定されたイニシャライザを呼び出して、selfに割り当てます。結局、[super init]-[NSObject init]を呼び出します。そのあなたがNSObjectから直接継承する場合は、あなたが知っている(とあなたが保証している)ので、あなたは、おそらくself = [super init];の逢引をしないために安全だ、

- (id)init { 
    return self; 
} 

ので技術的According to the documentation、それは次のように実装されますこれは、self = self;と同等です。これは意味がありません。それにかかわらず、一貫性のためにそれを残すべきです。

しかし、不透明なクラス(つまり、.mファイルを持たないクラス)を継承しているときは、継承チェーンをさらに下げ始めると、特にになります。指定された初期化子が次のようなクラスに遭遇する可能性があります:

- (id) initWithFoo:(id)aFoo { 
    if ([aFoo isSuperFast]) { 
    [self release]; 
    return [[SuperFastFooWrapper alloc] initWithFoo:aFoo]; 
    } 
    self = [super init]; 
    if (self) { 
    _foo = [aFoo retain]; 
    } 
} 

これは一般的ではありませんが、起こります。この場合、self[self release]、直前のallocコールとのバランスをとる)を破棄し、代わりに別のオブジェクトを返します。