使用Superclass类方法和init方法初始化之间的区别

时间:2013-12-21 19:54:51

标签: ios objective-c sprite-kit skspritenode

我试图了解使用[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;
}

这里按预期工作。 self有点AppNode,但在下面,即使投出也会返回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;
}

1 个答案:

答案 0 :(得分:3)

简答:您的第一个代码块是正确的,而您的第二个代码块不正确。

init方法是INSTANCE方法。 init方法被发送到一个已经存在的新创建的对象,它的工作是设置要使用的对象。

在自定义子类的init方法中,调用超类的init方法,以便超类有机会对超类进行任何设置。然后执行特定于自定义子类的init代码。

在第二个代码块中,丢弃已分配的对象,并使用SKSpriteNode类方法创建SKSpriteNode类型的新对象。将对象转换为不同的类类型只会抑制编译器警告 - 它不会更改对象的类。