2012-02-01 2 views
4

사용자가 동일한 문제를 경험 한 StackOverflow에 대한 몇 가지 질문이 있습니다. 그러나 그들의 해결책 중 어느 것도 나의 경우에 맞지 않았습니다. (here 내가 읽을 수는 있지만 한 SO 몇 가지 질문에 대한 here, herehere를 참조하십시오 도움이 발견하지 않았습니다.) 내 경우UIButton이 ARA를 사용하여 EXC_BAD_ACCESS를 발생시키는 IBAction을 터치합니다.

을, 나는 관련 컨트롤러보기로 몇 UIButton의가있는 NIB을 가지고 . 보기가 비교적 오래되어서 오늘까지이 버튼을 아무런 문제없이 사용할 수있었습니다. 버튼 동작과 관련이없는 몇 가지 코드를 변경 한 후에는 앱을 충돌시키는 오류가 발생하여 main() 코드에서 코드를 깨고 버튼을 클릭 할 때마다 EXC_BAD_ACCESS 오류 메시지가 표시됩니다. 내보기에.

어떻게 또는 어떻게 될 수 있습니까? 나는 실제로 거의 모든 기능 코드를 주석 처리했습니다. 특히 오늘 이전에 수정 한 코드는 오류가 발생하는 것을 막을 수 없습니다.

내 프로젝트에서 자동 참조 횟수를 사용하고 있으며 이전에이 오류를 보지 못했습니다. 또한 NIB를 수정하지 않았고 IBAction 버튼과 관련이 없으므로 원인을 알 수 없습니다. 오류를 막는 유일한 방법은 내 컨트롤러보기 헤더 파일에 정의 된 IBAction 메쏘드로 내 NIB에 내 UIButton을 연결 해제하는 것입니다.

내 사용 사례의 유일한 "유일한"측면은 다른 하위보기 컨트롤러 내에서이보기의 하나 또는 두 개의 인스턴스를로드한다는 것입니다. 로드 된 분리 된 뷰의 인스턴스 수는 배열의 오브젝트 수에 따라 달라집니다. 아래는 이러한 뷰를 인스턴스화하고 다른 뷰의 하위 뷰로로드하는 데 사용하는 코드입니다.

//Called else where, this starts the process by creating a view that 
//will load the problematic view as a sub-view either once or twice. 
- (id)initWithPrimarySystemView:(SystemViewController *)svc 
{ 
    //First we create our parent, container view. 
    self = [super initWithNibName:@"ContainerForViewInstaniatedFromArrayObjs" bundle:nil]; 
    if (self) 
    { 
     //Assign parent DataModel to local instance 
     [self setDataModel:((DataModelClass*)svc.DataModel)]; 
     for (AnotherModel* d in DataModel.ArrayOfAnotherModels) 
     { 
      //Instantiate the SubViewController. 
      SubViewController* subsvc = [[SubViewController alloc] 
              initWithNibName:@"Subview" 
              bundle:nil 
              subviewPosition:d.Position ]; 

      //Add the SubViewControllers view to this view. 
      [subsvc.view setFrame:CGRectMake((d.Position-1)*315, 0, 315, 400)]; 
      [self.view addSubview:subsvc.view]; 
     } 
     [self setDefaultFrame: CGRectMake(0, 0, 640, 400)]; 
    } 
    return self; 
} 

이 도청 할 때 이전에, 심지어 그러나 이제 모든 UIButton의 충돌 응용 프로그램을 관련보기에 있던 버튼으로 어떤 문제가 발생하지 않은, 완벽하게 작동합니다.

SubViewController 및 viewDidLoad 메서드의 초기화 함수에는 새 ViewController를 만들 때 추가되는 표준 자동 생성 코드 외에는 아무 것도 포함되어 있지 않습니다.

이 문제를 수정하거나 진단하려면 어떻게해야합니까?

답변

8

코드에서 내 의견을 참조하십시오

{ 
    SubViewController* subsvc = [[SubViewController alloc] initWithNibName:@"Subview" bundle:nil subviewPosition:d.Position ]; 
    //!i: By default, subsvc is a __strong pointer, so your subview has a +1 retain count 
    // subsvc owns subsvc.view, so subsvc.view has a +1 retain count as well 

    //Add the SubViewControllers view to this view. 
    [subsvc.view setFrame:CGRectMake((d.Position-1)*315, 0, 315, 400)]; 

    [self.view addSubview:subsvc.view]; 
    //!i: This bumps subsvc.view to +2, as self.view strong-references it 

    //!i: subsvc is going out of scope, so the reference count on subsvc will drop 
    // to 0 and it is dealloc'd. subsvc.view's retain count drops to +1, as it 
    // is still referenced by self.view 
    // 
    // Most likely, in -[SubViewController dealloc], you were not doing a 
    // setTarget:nil, setAction:nil on the button. Thus, the button now 
    // has a dangling pointer and will crash when hit 
} 

마스터 뷰 controler를 소유 배열에 각 SubViewController 인스턴스를 추가,이 문제를 해결하려면. SubViewController 인스턴스가 버튼 탭을 받도록 유지합니다.

+0

흥미롭게도, 나는 내 책상에 도착했을 때 이것을 시도 할 것이다. 이것이 문제를 해결할 수있는 이유를 알 수 있지만 약간 혼란 스럽습니다. 나는이 메커니즘을 2 주 동안 실시했습니다. 나는 그것에 대한 하나의 문제가 없었고, 내가 꼬인 코드와 관련 코드를 가지고 있지도 않았다.당신이 말하고있는 것이 문제라면, 이것은 언제나 하나의 임의의 날에 마술처럼 문제가되지 않았던 것처럼 보입니다. 특정 상황에서 이것이 정상적으로 작동하는 데 어떤 단서가 있습니까? – RLH

+0

고맙습니다. – RLH

+0

최근 ARC로 업그레이드하셨습니까? 이것은 수동 참조 계산에서 누출처럼 보입니다. SubViewController를 유지하고 타이머를 사용 중이면 실행 루프를 유지하거나 UIViewAnimation을 사용하여 애니메이트 할 수도 있습니다. – iccir

1

당신의 dealloc에 ​​있는지 확인하십시오 당신이 전화 :

[버튼 removeTarget : 행동 무기 호 : NULL forControlEvents : UIControlEventAllEvents]

비록 ARC에서 "dealloc"이 필요하지 않지만, iccir가 설명 한 바에 따라 수행합니다.

+0

이러한 모든 UIView 개체가 IB에서 만들어지고 IBOutlets를 통해 연결된 경우 필요합니까? 나는 이것을하기위한 지시를 결코 읽지 않았다. – RLH

+1

예 - 특히 IB의 경우. IB는 생성하지만 객체의 파괴는 처리하지 않습니다. – dacopenhagen

관련 문제