2013-12-21 210 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类型的新对象。将对象转换为不同的类类型可以简单地抑制编译器警告 - 它不会更改对象的类。