2011-02-22 44 views
0

簡單地說,我有一個類實現:超]建設

@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]; 

對於第一類變種的ClassBinit被調用,但對於第二種情況 - 沒有。

爲什麼?這兩個alloc結構具有相同的含義嗎?

回答

2

[[ClassB superclass] superclass]將是ClassA的超類(可能是NSObject - 我將假設對於此答案的其餘部分)。所以第二個變體特別相當於[NSObject alloc]。這意味着您將init發送給的對象只是一個NSObject,而不是ClassA或ClassB。

在第一變,[ClassB alloc]執行ClassA的的實現(通過繼承),在電話的情況下,其中[super alloc]類不是ClassA的(這ClassB的不算),它執行的alloc默認實現。這分配一個ClassB,然後發送init

我認爲你的困惑是由[[self superclass] theCurrentMethod]相當於[super theCurrentMethod]的假設造成的。不是。 super關鍵字使接收者(self)保持不變,但只是在將該消息解析爲特定實現時跳過當前類。但是當你明確地發送信息到[self superclass]時,超類本身就是接收者。

+0

謝謝Chuck,這很明顯:) – 2011-02-23 08:03:53