1

次のような便利なコンストラクターを持つスーパークラスがある場合 (ARC を使用):

+(id)classA {
    ClassA *foo = [[ClassA alloc] init];

    return foo;
}

次に、ClassB という名前のクラスで ClassA をサブクラス化し、便利なコンストラクターをオーバーライドしたい場合は、次のようになります。

+(id)classB {
    ClassB *foo = [ClassA classA];

    return foo;
}


(ClassB で alloc と init を呼び出せないと仮定します)。

ありがとう!

4

2 に答える 2

3

クラス メソッドはインスタンス メソッドと同じように渡されselfますが、クラス メソッドの場合のみ、 の値selfが のインスタンスになりClassます。したがって、classAメソッドを次のように変更します。

+ (id) classA
{
   return [[self alloc] init];
}

new(これは、継承元の定義にすぎませんNSObject。規則でnewXは、保持された参照がclassnameX返され、自動解放された参照が返されます。ARC を使用した場合の違いは本当に意味がありませんが、私はnewX自分自身で行きます。)

ifがthenClassBのサブクラスであると、beingで呼び出され、 you willとインスタンスが呼び出されます。ClassA[ClassB classA]classAselfClassBallocinitClassB

于 2012-02-11T23:39:04.580 に答える
2

いいえ、それは正しくありません。これは、ClassBではなくClassAを割り当て、初期化し、返すためです。これを行う唯一の方法は、ClassAを明示的に使用しないことです。

+ (id) classA
{
    return [[self alloc] init];
}

もちろん、newこれには昔ながらのものを使用することもできます。

ClassB *myB = [ClassB new];

FWIW、割り当てて初期化するだけではなく、クラスの名前がガジェットであると仮定すると、次のようになります。

+ (id) gadgetWithNumber: (int) num
{
    return [[self alloc] initWithNumber: num];
    // or without ARC:
    // return [[[self alloc] initWithNumber: num] autorelease];
}

もちろん、それはinitWithNumber:私のクラスにメソッドがあることを前提としています。

于 2012-02-11T22:25:04.880 に答える