如果没有init方法,如何正确地子类化SKNode?

时间:2013-12-31 19:21:23

标签: ios objective-c sprite-kit sknode

SKNode仅提供+node方法。

如果你这样做:

+ (instancetype)node {
    CustomNode *body = [CustomNode node]; // infinite loop
}

如果你这样做:

+ (instancetype)node {
    CustomNode *body = [super node]; // instance of SKNode, not CustomNode
}

如何以只能覆盖构造函数的方式对只具有便捷构造函数的类进行子类化?或者,最佳做法是创建自己的+customNode方法吗?

3 个答案:

答案 0 :(得分:7)

没有人说你不能在SKNode子类上使用[... alloc] init]。毕竟,SKNode是NSObject的子类。 +node只是一种方便的方法。

+ (instancetype)node {
    CustomNode *body = [[self alloc] init];
    return body;
}

这没有错。

答案 1 :(得分:1)

+ (instancetype)node {
    CustomNode *body = [CustomNode node]; // infinite loop
}

无限循环是预期的结果,因为您调用相同的方法。至于另一个:

+ (instancetype)node {
    CustomNode *body = [super node]; // instance of SKNode, not CustomNode
}

此处的目标是让您CustomNode按预期进行初始化。例如,当您创建UIViewController时,这是同样的事情:

if ( self == [super initWithNibName:nibName bundle:bundle])

您想要进行标准初始化。您所做的是使CustomNode成为自定义节点的原因。 :)

+ (instancetype)node {
    CustomNode *body = [super node];
    // My own logic goes here

   return body;
}

答案 2 :(得分:0)

解决方案实际上什么都不做。 +[SKNode node]的默认实现返回调用它的任何类或子类的实例。

不要覆盖子类中的+[SKNode node]。实例化类的实例,如以下示例所示:

// In MyScene.m
// MyNode is a SKNode subclass

- (void)createNewNode
{
    MyNode *node = [MyNode node]; // node is of type MyNode

    [self addChild:node];
}