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 is thenClassB的一个子类将调用being ,而你将调用一个实例。ClassA[ClassB classA]classAselfClassBallocinitClassB

于 2012-02-11T23:39:04.580 回答
2

不,这是不正确的,因为它分配、初始化并返回 ClassA,而不是 ClassB。这样做的唯一方法是不显式使用 ClassA:

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

当然,您也可以为此使用老式new的:

ClassB *myB = [ClassB new];

FWIW,假设我想做的不仅仅是分配和初始化,而且我的类被命名为 Gadget,那么我会做类似的事情:

+ (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 回答