0

[super init]我试图了解使用vs初始​​化子类有什么区别[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;
}
4

1 回答 1

3

简短的回答:你的第一段代码是正确的,你的第二段代码是不正确的。

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

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

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

于 2013-12-21T20:11:46.450 回答