我试图了解使用[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;
}
答案 0 :(得分:3)
简答:您的第一个代码块是正确的,而您的第二个代码块不正确。
init方法是INSTANCE方法。 init方法被发送到一个已经存在的新创建的对象,它的工作是设置要使用的对象。
在自定义子类的init方法中,调用超类的init方法,以便超类有机会对超类进行任何设置。然后执行特定于自定义子类的init代码。
在第二个代码块中,丢弃已分配的对象,并使用SKSpriteNode类方法创建SKSpriteNode类型的新对象。将对象转换为不同的类类型只会抑制编译器警告 - 它不会更改对象的类。