超级]建设

时间:2011-02-22 23:35:45

标签: objective-c cocoa

简而言之,我有一个类实现:

@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结构是否具有相同的含义?

1 个答案:

答案 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]发送消息时,超类本身就是接收者。