2009-08-15 8 views
10

このようなことをしてはならない理由はありますか? 例:[MyClass alloc]と[[self class] alloc]の違いはどこですか?

私はクラスを持っていますMyClass。そこでは、私はこの実装を持っている:違いは最初のものだけで独自のクラスならば名前を使用していること、である

- (id)copyWithZone:(NSZone*)zone { 
    MyClass *copy = [[[self class] allocWithZone:zone] init]; 
    copy.someproperty = [[self.someproperty copy] autorelease]; 
    return copy; 
} 

:その代わりの

- (id)copyWithZone:(NSZone*)zone { 
    MyClass *copy = [[MyClass allocWithZone:zone] init]; 
    copy.someproperty = [[self.someproperty copy] autorelease]; 
    return copy; 
} 

、私はこのようになりますスニペットを見つけましたまるでそれが他のクラスであるかのように人間的に読める。そして、第二の人は、どのようなクラスであるかを自分に尋ねます。それは違いを生み出すのでしょうか、この場合にはどちらも使えますか?

答えて

10

サブクラスMyClassの場合、-copyWithZone:の2番目の例では、サブクラスのインスタンスが返されます。最初の例はそうではなく、MyClassのインスタンスを返します。

+0

同じクラスのインスタンスを作成したい場合、クラス内では、[TheClass alloc]ではなく[[self class] alloc]を常に呼び出す必要がありますか? –

+0

サブクラスがそのメソッドを処理するかどうかによって異なります。 -copyWithZoneでは、サブクラスがsuperを介してメソッドを呼び出し、余分な設定を行い、結果を返すことができます。したがって、[self class]を使用する方が望ましいです。 –

+0

サブクラスは必ずしもスーパーを介してそれを呼び出す必要はありません。サブクラスに独自の余分な変数がない場合、余分な作業をせずに継承できます。 – user102008

関連する問題