Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C-对象是init';d使用它的superscustominit,如何调用自己的init逻辑?_Objective C_Cocos2d Iphone_Kobold2d - Fatal编程技术网

Objective-C-对象是init';d使用它的superscustominit,如何调用自己的init逻辑?

Objective-C-对象是init';d使用它的superscustominit,如何调用自己的init逻辑?,objective-c,cocos2d-iphone,kobold2d,Objective C,Cocos2d Iphone,Kobold2d,我正在翻阅一本cocos2D的书,试图初始化一个雷达天线对象。动画是在initAnimations方法(在init方法中调用)中设置的,但是从未调用init方法。在GameLayer.m中,他们使用createObjectOfType方法调用: RadarDish *radarDish = [[RadarDish alloc] initWithSpriteFrameName:@"radar_1.png"]; 所以initWithPriteFrameName是RadarDish超类的一个init

我正在翻阅一本cocos2D的书,试图初始化一个雷达天线对象。动画是在initAnimations方法(在init方法中调用)中设置的,但是从未调用init方法。在GameLayer.m中,他们使用createObjectOfType方法调用:

RadarDish *radarDish = [[RadarDish alloc] initWithSpriteFrameName:@"radar_1.png"];

所以initWithPriteFrameName是RadarDish超类的一个init,它设置了雷达天线。那么RadarDish.m的init什么时候被呼叫过??它导致我的程序崩溃,因为动画从未在init中设置。

您需要在任何子类中覆盖
initWithPriteFrameName:
,包括
RadarDish
,它需要自己的初始化步骤。在该方法中,您需要调用超类,然后继续处理子类的特定需求,如下所示:

- (id)initWithSpritFrameName: (NSString *)frameName
{
    self = [super initWithSpriteFrameName:frameName];
    if( !self ) return nil;

    [self initAnimations];    // As long as initAnimations doesn't also call a
                              // superclass's initializer!
    // Other setup...

    return self;
}
现在,
[[RadarDish alloc]initWithPriteFrameName:…]
将使用此实现,确保为对象设置动画


您还应该更改
initAnimations
的名称,因为Cocoa的惯例是,只有实际的实例初始值设定项(即获取“原始”实例并完全准备实例的方法)应该以
init
开头。称它为
setUpAnimations
或类似的东西。

您需要在任何子类中重写
initWithPriteFrameName:
,包括
RadarDish
,它需要自己的初始化步骤。在该方法中,您需要调用超类,然后继续处理子类的特定需求,如下所示:

- (id)initWithSpritFrameName: (NSString *)frameName
{
    self = [super initWithSpriteFrameName:frameName];
    if( !self ) return nil;

    [self initAnimations];    // As long as initAnimations doesn't also call a
                              // superclass's initializer!
    // Other setup...

    return self;
}
现在,
[[RadarDish alloc]initWithPriteFrameName:…]
将使用此实现,确保为对象设置动画


您还应该更改
initAnimations
的名称,因为Cocoa的惯例是,只有实际的实例初始值设定项(即获取“原始”实例并完全准备实例的方法)应该以
init
开头。称它为
setUpAnimations
或类似的东西。

如何定义
initWithSpriteFrameName
呢?它是否调用
init
?如何定义
initWithPriteFrameName
?它是否调用
init
?在上面的代码中调用[self init]是可能的,因为调用了相当多的变量和方法,还是在同一个类中调用两个init方法会把事情搞砸?请参阅。您可以链接初始值设定项方法,但只有最后一个方法可以调用super的初始值设定项,理想情况下,只有一个方法可以执行任何工作;其他的应该直接调用。在上面的代码中调用[self init]是可能的,因为调用了相当多的变量和方法,还是在同一个类中调用两个init方法会把事情搞砸?请参阅。您可以链接初始值设定项方法,但只有最后一个方法可以调用super的初始值设定项,理想情况下,只有一个方法可以执行任何工作;其他人应该直接打电话过去。