2013-02-06 2 views
0

나는 cocos2D 책을 통해 가고 Radar Dish 개체를 초기화하려고합니다. 애니메이션은 init 메소드에서 호출되는 initAnimations 메소드에서 설정되지만 init 메소드는 결코 호출되지 않습니다.Objective-C - 객체가 supers 사용자 정의 init을 사용하여 초기화됩니다. 어떻게 자신의 init 논리를 호출 할 수 있습니까?

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

그래서 initWithSpriteFrameName이 RadarDish의 슈퍼 클래스의 초기화이며,이 레이더 접시를 설정하십시오 GameLayer.m에서 그들은 호출하는 createObjectOfType 방법을 사용합니다. 그래서 RadarDish.m의 init은 언제 호출 되나요 ?? 애니메이션이 init에서 설정되지 않기 때문에 프로그램이 중단되는 원인이됩니다.

+0

어떻게'initWithSpriteFrameName'이 정의 되었습니까? 'init'을 호출합니까? – sergio

답변

3

RadarDish을 포함하여 임의의 하위 클래스에서 initWithSpriteFrameName:을 재정의해야합니다. 해당 초기화 단계가 필요합니다. 이 방법에서는, 당신은과 같이, 슈퍼 클래스의 designated initializer을 호출 한 다음 서브 클래스의 특정 요구를 계속해야합니다

- (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] initWithSpriteFrameName:...]이 개체에 설정된 애니메이션을 확보,이 구현을 사용합니다.

initAnimations의 이름을 변경해야합니다. 코코아 규칙은 "원시"인스턴스를 가져 와서 인스턴스를 완전히 준비하는 실제 인스턴스 초기화 프로그램 만 init으로 시작해야한다는 것입니다. setUpAnimations 또는 이와 비슷한 이름으로 지정하십시오.

+0

위의 코드에서 [self init]을 호출 할 수 있습니까? 상당히 많은 변수와 메서드가 호출되었거나 동일한 클래스의 두 init 메서드를 호출하기 위해 작업을 망칠까요? – robertfiorentino

+1

[ "Multiple initializers"(http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/MultipleInitializers.html%23//apple_ref/doc/uid/TP40008195-CH33)를 참조하십시오. -SW1). 초기화 메소드를 연결할 수는 있지만, 마지막 메소드 만 super의 초기화 메소드를 호출 할 수 있으며 이상적으로는 그 중 하나만 수행하면된다. 다른 사람들은 단순히 전화해야합니다. –