子类化便利构造函数

时间:2012-02-11 22:14:03

标签: objective-c convenience-methods

如果我有一个带有便利构造函数的超类,如下所示(使用ARC):

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

    return foo;
}

如果我然后使用名为ClassB的类继承ClassA,并且我想覆盖方便构造函数,则以下是正确的:

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

    return foo;
}


(假设我不能在ClassB上调用alloc和init。)

谢谢!

2 个答案:

答案 0 :(得分:3)

类方法与实例方法一样传递self,只有在类方法的情况下,self的值才是Class的实例。因此,请将classA方法更改为:

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

(这只是您从new继承的NSObject的定义。约定newX返回保留的引用,而classnameX返回自动释放的引用。使用ARC差别真是没有实际意义,但我会自己去newX。)

现在,如果ClassBClassA的子类,那么[ClassB classA]classA调用self ClassBalloc {1}}和init ClassB个实例。

答案 1 :(得分: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:方法。