如果我有一个带有便利构造函数的超类,如下所示(使用ARC):
+(id)classA {
ClassA *foo = [[ClassA alloc] init];
return foo;
}
如果我然后使用名为ClassB的类继承ClassA,并且我想覆盖方便构造函数,则以下是正确的:
+(id)classB {
ClassB *foo = [ClassA classA];
return foo;
}
(假设我不能在ClassB上调用alloc和init。)
谢谢!
答案 0 :(得分:3)
类方法与实例方法一样传递self
,只有在类方法的情况下,self
的值才是Class
的实例。因此,请将classA
方法更改为:
+ (id) classA
{
return [[self alloc] init];
}
(这只是您从new
继承的NSObject
的定义。约定newX
返回保留的引用,而classnameX
返回自动释放的引用。使用ARC差别真是没有实际意义,但我会自己去newX
。)
现在,如果ClassB
是ClassA
的子类,那么[ClassB classA]
会classA
调用self
ClassB
,alloc
{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:
方法。