简而言之,我有一个类实现:
@implementation ClassB: ClassA
-(id) init {
if (self = [super init]) {
...
}
return self;
}
@end
一个类别,有两种变体:
1
@implementation ClassA (ClassA_Category)
+(id) alloc {
if ([self isEqual: [ClassA class]]) {
return [ClassB alloc];
} else {
return [super alloc];
}
}
@end
2
@implementation ClassA (ClassA_Category)
+(id) alloc {
return [[ClassB superclass] superclass] alloc];
}
@end
问题在于这个简单的初始化:
ClassA *aObj = [[ClassA alloc] init];
对于第一类变体,init
的{{1}}被调用,但对于第二种情况 - 则不会。{/ p>
为什么?这两个ClassB
结构是否具有相同的含义?
答案 0 :(得分:2)
[[ClassB superclass] superclass]
将是ClassA的超类(可能是NSObject - 我将在这个答案的其余部分假设这样)。所以第二个变体特别等同于[NSObject alloc]
。这意味着您发送init
的对象只是一个NSObject,而不是ClassA或ClassB。
在第一个变体中,[ClassB alloc]
执行ClassA的实现(通过继承),在类不是ClassA(ClassB不是)的情况下调用[super alloc]
,它执行默认的实现alloc
。这将分配一个ClassB,然后发送init
。
我认为您的混淆是由[[self superclass] theCurrentMethod]
等同于[super theCurrentMethod]
的假设引起的。不是。 super
关键字使接收方(self
)保持不变,但在将该消息解析为特定实现时,只是跳过当前类。但是当你明确地向[self superclass]
发送消息时,超类本身就是接收者。