从指定的初始化程序调用超静态方法

时间:2014-04-07 14:06:52

标签: ios objective-c sprite-kit

[SKNode节点]返回初始化节点。 ( https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKNode_Ref/Reference/Reference.html#//apple_ref/occ/clm/SKNode/node

如果我是SKNode的子类:

@interface MyClass:SKNode

然后在MyClass中指定的初始化程序中,我调用超级指定的初始化程序(类方法)。

@implementation MyClass
{ 
    MyScene _MyScene;
}

- (instancetype)initWithScene:(MyScene *)myScene
{
    _MyScene = myScene;
    if (self = [SKNode node]) { // HERE I GET ERROR
     }
     return self;

}

错误:将赋值结果用作不带括号的条件 如果我把它改为:

if ((self = [SKNode node]))

我得到:从(SKNode *)分配给(MyClass *)的不兼容指针类型 如果是一个类方法,调用超级指定初始值设定项的方法是什么?我也试过了 调用self =(MyClass *)[SKNode节点],但我得到一个奇怪的错误。

2 个答案:

答案 0 :(得分:1)

  

我得到:从(SKNode *)分配给(MyClass *)的不兼容指针类型

问题是[SKNode node]SKNode的实例中分配和初始化,这意味着您没有机会将该对象转换为您自己的子类的实例。您收到了不兼容的指针错误,因为您正在尝试将SKNode *分配给self MyClass *

相反,您需要自己进行分配,以便在超类初始化之后为实例变量留下足够的空间。所以,做一些像:

self = [super init];
if (self) {
//...
}
  

我也试过调用self =(MyClass *)[SKNode节点]但是我得到了一个奇怪的错误。

这基本上是同一个问题。将[SKNode node]投射到MyClass *类型并不会改变对象本身是SKNode的实例,而不是MyClass的实例的事实。同样,您需要创建MyClass的实例(使用+alloc),然后调用超类的(SKNode)初始化程序,然后然后执行MyClass初始化。

答案 1 :(得分:0)

将此行更改为:

if (self = [super init]) {
...

您不想创建一个SKNode对象,而是通过调用:[SKNode node]来尝试这样做。