2012-10-20 4 views
3

이 충돌은 시뮬레이터에서만 발생합니다. 실제 장치에서는 제대로 작동하고 디버그됩니다. (따라서 너무 중요하지하지만 난 시뮬레이터 편리하게 제공하는 프리젠 테이션에서 일하고 있습니다.)시뮬레이터에서 ABPeoplePickerNavigationController가 해제되는 동안 오류가 발생합니다.

- (BOOL)peoplePickerNavigationController: 

(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 


    [self displayPerson:person]; 

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]){ 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } else { 
     [self dismissModalViewControllerAnimated:YES]; 
    } 

    return NO; 
} 

충돌이에 :

[self dismissViewControllerAnimated:YES completion:nil]; 

내가 보는 모든이 : "Thread 1: EXC_BREAKPOINT (code=EXC_I386_BTP, subcode=0x0)"

디버그 창에 특정 출력이 없습니다. Zoombies가 사용 설정되었습니다. 나는 ARC를한다.

그것이 내가 (아이팟 터치 4 세대, 아이폰 4, 아이폰 4S)가 장치에서 잘 실행되고 있는지 기억

-(void)showPeoplePickerController 
{ 

    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 

    picker.peoplePickerDelegate = self; 

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) { 
     [self presentViewController:picker animated:YES completion:nil]; 
    } else { 
     [self presentModalViewController:picker animated:YES]; 
    } 

    return; 
} 

: 프로그래밍 다음 코드를 사용하여 ... 나는 스토리 보드를 사용하고 있지만, 나는 ABPersonPicker 전화

+0

중단 점을 넣음으로써 코드를 디버깅 해 보았습니다. 어떤 줄에서 충돌이 발생 했습니까? –

+0

또한 iOS에 종속적 일 수도 있고, 장치 및 시뮬레이터 iOS 버전도 동일 할 수 있습니까? –

+0

디바이스, 시뮬레이터 모두 iOS 6.0 (10A403)입니다. 예, 거기에 중단 점을 설정했습니다. 호출 스택은 dismissViewControllerAnimated : complete : –

답변

4

문제는 피커에 대한 강력한 참조를 유지하지 않는 것입니다. ivar을 추가하여 대리자 콜백에서 완료하면 기본 대기열에서 디스패치 asyn 블록을 사용하여 ivar을 출력하지 않고 해제하십시오. (iPad에서 코드를 입력하지 않아도 됨)

EDIT : showPeoplePickerController 메소드를 살펴 봅니다. 피커를 만들고 자동으로 저장하여 메소드를 종료 할 때 해제됩니다. 자동 대신 ivar를 사용하여 picker에 대한 강력한 참조를 유지하려고합니다.

위임자 콜백에서 피커를 놓기를 원하지 않습니다.이 기능은 종종 작동하지만 예기치 않은 시간에 물어 뜯기 때문에 델리게이트 콜백이 완료된 후이 유형의 객체를 해제하려고합니다. 사실 나는 보통 'picker = nil'을 사용하여 객체를 공개 할 수 있다면 먼저 객체 위임 속성을 nil로 설정합니다. 블록에서 'picker'는 'self-> picker'로 변환됩니다. performSelector : afterDelay : 0도 사용할 수 있습니다. 블록을 선호합니다.

EDIT2 : 그래서 난 그냥 돌아올 수있다

- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 

에서하는 일. 이 메시지가 나타날 때까지 기다리십시오 :

- (void)peoplePickerNavigationControllerDidCancel: 

dismis. 나는 또한 선택된 주소를 저장하는 것을 확인하고 해산을하는 액션 시트를 띄우는 다른 코드를 가지고있다. 그러나 이전 코드와 어떻게 작동하는지 확실하지 않다. 어쨌든 이것이 도움이되기를 바랍니다.

+0

에서 호출 된 CFHash 내에서 오류가 발생했다는 것을 알려줍니다. 조금 더 설명해 주시겠습니까? 위임 메서드 shouldContinueAfterSelectingPerson에 대해 설명합니다. 피커라고 불리는 동안 내 이해는 여전히 유효합니다. 피커에 대한 참조가 대리자에게 전달되므로 약한 참조가 필요하지 않습니다. 피커는 아직 살아 있고 유효합니다. 계속할지 여부에 관계없이 반환 값에 따라 달라집니다. 그러나 나는 그것을 시도 할 것이다. 그러나 나는 그것을 오히려 이해할 것이다. –

+0

좋습니다. 나는 그것을 시도했다. 도움이되지 않습니다. –

+0

나는 항상 똑같은 질문에 12 번 대답했다. 그래서 항상 강한 참고가 부족하다. 객체가 다른 곳에서 유지되는 동안 조기에 릴리스되고 종종 시뮬레이터 동작이 실제 디바이스와 다릅니다. –

관련 문제