Objective-C-对象是init';d使用它的superscustominit,如何调用自己的init逻辑?
我正在翻阅一本cocos2D的书,试图初始化一个雷达天线对象。动画是在initAnimations方法(在init方法中调用)中设置的,但是从未调用init方法。在GameLayer.m中,他们使用createObjectOfType方法调用: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
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的初始值设定项,理想情况下,只有一个方法可以执行任何工作;其他人应该直接打电话过去。