2013-12-21 216 views
0

我想了解使用[super init][SuperClassType classMethod]初始化子類之間有什麼區別。以下是代碼示例:使用超類方法初始化與初始化方法之間的區別

-(instancetype)initWithAPPImageName:(NSString *)appImageName { 

    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"character"]; 
    self = (AppNode *)[super initWithTexture:[atlas textureNamed: appImageName]]; 

    if(self) 
    { 
     self.name = @"appNode"; 

     if([self isKindOfClass:[AppNode class]]) 
     { 
      self.position = [self GetPosition]; 
     } 
    } 

    return self; 
} 

此處按預期工作。 selfAppNode的一種,但在下面,它總是會返回SKSpriteNode即使投射。有什麼不同嗎?

-(instancetype)initWithAPPImageName:(NSString *)appImageName { 

    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"character"]; 
    self = (AppNode *)[SKSpriteNode spriteNodeWithTexture:[atlas textureNamed:appImageName]]; 

    if(self) 
    { 
     self.name = @"appNode"; 

     if([self isKindOfClass:[AppNode class]]) 
     { 
      self.position = [self GetPosition]; 
     } 
    } 

    return self; 
} 

回答

3

簡答:您的第一個代碼塊是正確的,而您的第二個代碼塊不正確。

init方法是INSTANCE方法。 init方法被髮送到一個已經存在的新創建的對象,它的任務是設置對象以供使用。

在自定義子類的init方法中,您可以調用超類的init方法,以便超類有機會進行超類所需的任何設置。然後你執行特定於你的自定義子類的init代碼。

在您的第二個代碼塊中,放棄分配的對象並使用SKSpriteNode類方法創建SKSpriteNode類型的新對象。將對象轉換爲不同的類類型可以簡單地抑制編譯器警告 - 它不會更改對象的類。