2010-08-20 3 views
0

내 View Controller에서 dismissModalViewControllerAnimated를 호출 한 후 EXC_BAD_ACCESS가 표시됩니다. 내 프로젝트는 테이블 뷰 스타터 프로젝트를 기반으로하고 RootViewController이 같은 뷰를 작성한다 :popViewControllerAnimated 호출 후 EXC_BAD_ACCESS

- (IBAction) onDone:(id) sender; 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

를 들어 GobanVC.m에서

GobanVC *vc = [[GobanVC alloc] initWithNibName:@"GobanVC" bundle:[NSBundle mainBundle] coll:c]; 
[self.navigationController pushViewController:vc animated:YES]; 
[vc release]; 

, 내가보기를 기각 할 버튼을 처리하고있어 GobanVC 객체가 과도하게 공개되는 몇 가지 이유가 있습니다. 할당 도구를 실행하고 alloc을 호출하면 참조 횟수가 1로 설정되고 UIKit 호출은 여러 번 유지/릴리스되고 위의 릴리스가 처리된다는 것을 알 수 있습니다. 그 후, retain 또는 release 중 어느 것도 내 코드에서 가져 오지 않으며 popViewControllerAnimated 이후에는 결국 -1이됩니다.

위의 릴리스를 사용하면 상황이 정상적으로 작동하는 것처럼 보이므로 정확히 하나의 어딘가에 카운트가 해제 된 것처럼 보입니다.

아이디어가 있으십니까?

+1

내 View Controller에서 dismissModalViewControllerAnimated를 호출 한 후 EXC_BAD_ACCESS가 표시됩니다. 왜 처음에 해고하고 코드가 popViewController라고 말하는지, 그것이 맞는지 확신 할 수 있습니까? – vodkhang

답변

0

아마도 GobanVC에 문제가있을 수 있습니다. 그것을위한 구현이 있습니까?

UIKit에서 만든 모든 릴리스에 대해 보유가있는 경우 (있어야 함) 때문입니다. 그리고 통화가 균형을 이루고 있다고 (하나의 alloc과 하나의 릴리스) 말합니다.

그렇다면 GobanVC의 구현에 문제가 있음을 의미합니다. 당신이 팝업 카운터를 유지할 것이다 호출 할 때 스택에서 나오는 것,

  1. ALLOC이되면 1
  2. 릴리스 0

그래서하게한다 :

-1

의이 (가) 유지 계산하자 0과 같습니다. 이것은 당신이 원하는 것이 아닙니다. 릴리스를 제거하거나 유지하고 "retain"속성으로 정의 된 인스턴스 변수에 "vc"를 할당하면 문제가 없습니다.

  1. 루트 컨트롤러는 GobanVC의 인스턴스를 생성 : 코드에서

    당신은 내가 다음을 참조 할 수 있습니다 제공. GobanVC 보유 수는 1입니다.

  2. 루트 컨트롤러는 GobanVC 인스턴스를 탐색 스택에 푸시합니다. 푸시가 보유 개수를 늘리는 지 확실하지 않습니다. 아마 그렇 겠지. 그런 다음 GobanVC 인스턴스의 유지 카운트 (안 루트 컨트롤러) GobanVC에있는 1

  3. 단추 처리기의 카운터를 설정, 당신은 GobanVC 인스턴스를 해제 2.

  4. 된다. 따라서, GobanVC는 보유 카운트가 0 인 스택에서 ITSELF를 팝합니다 (푸시가 카운터를 늘리면 팝이 감소하기 때문입니다). 이것은 문제입니다.

+0

귀하의 가정은 정확합니다.보기 컨트롤러를 누르면 '보관함'메시지가 전송되고 터지면 '해제'메시지가 전송됩니다. 하지만 'onDone'에서 보유 횟수가 0이되면 문제가되지 않는다고 생각합니다. 'popViewControllerAnimated :'메시지가 보내지고, 함수는 끝나고, 그 시점에서 뷰 컨트롤러는 더 이상 필요가 없습니다. –

+0

아마도 네, 아닐 수도 있습니다. 전후에 어떤 일이 일어나고 기본 객체 관리가 어떻게 작동하는지에 따라 달라집니다. 이 세부 사항을 알고 있습니까? 나는하지 않는다. 적어도 나는 물건의 내부에서 자살적인 조건을 만들지 않으려 고했다. 내 경험에 비추어 볼 때 이러한 불확실한 부동성 (생존하기 전에 또는 죽기 전에 죽는가?)은 잡기가 매우 어렵고 언제든지 임의로 공격 할 수있는 유형의 오류입니다. – spbfox