2013-03-08 5 views
3

클래스의 배열에서 임의의 사운드를 트리거하는 버튼이 있습니다. IBAction에 의해 트리거되는 내보기 컨트롤러에 게으른 인스턴스화가 있지만 두 가지 이유로 이것이 잘못된 것으로 생각됩니다.보기 컨트롤러의 지연 인스턴스화

1) 일반적으로 L.I. in 게터 및 세터.

L.I. getter/setter에서 프로그램이 중단되고 이유를 알 수 없습니다.

2) I 뷰 컨트롤러 IBAction를 내부 지연이 실체화 을 수행하고있다.

지연 성 인스턴스화를 수행하는 올바른 방법입니까? 여기

- (IBAction)myClass:(UIButton *)sender { if (!self.myClass){ self.myClass = [[myClass alloc] init]; [self.myClass setUpMyClass]; // this method just loads sounds and some text } [self.myClass playSound]; self.myClassLabel.text = [[NSString alloc] initWithFormat:@"%@", [self.myClass someText]]; } 

충돌 코드입니다 : 여기

충돌하지 않는 코드입니다

- (myClass *)myClass 
{ 

    if (!self.myClass){ 
     self.myClass = [[myClass alloc] init]; 
     [self.myClass setUpMyClass]; // this method just loads sounds and some text 
    } 

    return self.myClass; 
} 

- (IBAction)myClass:(UIButton *)sender 
{ 
    [self.myClass playSound]; 
    self.myClassLabel.text = [[NSString alloc] initWithFormat:@"%@", [self.myClass someText]]; 

} 

디버거에 넣어 밖으로 많은 말을하지 않습니다하지만이 녹색 화살표가 표시됩니다.

-(myClass *) myClass { 

Thread 1: EXC_BAD_ACCESS (code=2, address =0xbf7ffffc) 

사용자 이름 아쿠아를 들어, 메소드 setUpMyMethod는 다음과 같습니다 : 귀하의 게터가 자신을 재귀 적으로 호출

-(void) setUpEscha{ 
    self.eschaDialogue = [[NSArray alloc] initWithObjects: 
         [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"mp3"], 
         [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"mp3"], 
         ... 
         nil]; 

self.eschaLines = [[NSArray alloc] initWithObjects: 
        @"String1", 
        @"String2", 
        @"...", 
        nil]; 

}

+1

코드가 일반적으로 괜찮아 보입니다. 그러나 실제 도움이 필요하면 충돌에 대한 정확한 세부 정보로 질문을 업데이트해야합니다. 오류 및 스택 추적을 포함하십시오. – rmaddy

+1

디버거로부터 정보를 제공하거나'setUpMyClass'에 대한 코드를 보여줄 수 있습니까? – aqua

+1

사이드 노트 : 마지막 줄은'self.myClassLabel.text = [self.myClass someText];'이어야합니다. 이것은'[self.myClass someText]'가'NSString'을 리턴한다고 가정합니다. – rmaddy

답변

4

. myClass 게터 내에서 self.myClass에 액세스하지 마십시오. myClass_myClass 때문이다

- (myClass *)myClass 
{ 
    if (!_myClass){ 
     _myClass = [[myClass alloc] init]; 
     [_myClass setUpMyClass]; // this method just loads sounds and some text 
    } 
    return _myClass; 
} 

이 당신의 바르 가정한다 : 당신의 코드를 변경합니다. 그렇지 않은 경우 _myClass을 iVar가 무엇이든 변경하십시오.

나중에 "XXX가 왜 충돌합니까?"라는 질문에 대한 답은 크래시에서 디버거 로그와 스택 추적을 포함하는 경우 유용합니다.

+0

어떻게 스택 추적을 볼 수 있습니까? – Moose

+1

속성이 공개 또는 비공개인지 여부는 중요하지 않습니다. 오랫동안 당신이 iVar을 올바르게 참조하고 있다면 문제가 해결 될 것입니다.여전히 문제가있는 경우 iVar, 속성 및 이와 관련된 모든 @ synthesize 문을 선언하는 코드를 게시해야합니다. – XJones

+0

나는 그것을 고쳤다. _myClass가되어야 할 때 self._myClass로 바꿨다. 그것은 지금 일하고있다. .. 고마워! – Moose

관련 문제