2011-11-16 3 views
1

내가 popToRootViewController 일 때 충돌이 발생합니다. 이것이 내가 설정 한 방법입니다.popover 해제 후 popToRootViewController, EXC_BAD_ACCESS

내가 가진 :

@property (nonatomic, retain) UIPopoverController *popover; 

의 dealloc에서 :

[popover release]; 

버튼이

if (self.popover == nil) { 
    DetailViewController *detailView = [[[DetailViewController alloc] init] autorelease]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(GoToTest:) name:TestDetailPressed object:detailView]; 
    self.popover = [[[UIPopoverController alloc] initWithContentViewController:detailView] autorelease]; 
    self.popover.delegate = self; 
    [self.popover presentPopoverFromRect:frame inView:self.scrollView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

을 눌렀을 때 내 DetailViewController은 본질적으로 단지 UITableView입니다. 행을 선택하면, 나는 GoToTest 다시이 현재의 클래스에 대한 통지를 게시 : 나는 악기를 실행하면

- (void)GoToTest:(NSNotification *)notification { 
    if ([self.popover isPopoverVisible]) { 
     [self.popover dismisspopoverAnimated:YES]; 
     [self handleDismissedPopover:self.popover]; 
    } 
    [self.navigationController popToRootViewControllerAnimated:NO]; 
} 

- (void)handleDismissedPopover:(UIPopoverController *)popoverController { 
    self.popover = nil; 
    self.popover.delegate = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:TestDetailPressed object:nil]; 
} 

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    [self handleDismissedPopover:popoverController; 
} 

, 나는

-[UIPopoverController _popoverDismissAnimationCompleted] 

의 좀비 메시지를 얻고 UIViewController은있다 그 시점에서 -1의 refCt.

답변

2

첫 번째 숫자 (self.popover = nil)가 이전 값을 해제하고 멤버를 nil로 설정하는 속성 setter를 호출하기 때문에 self.popover = nillpopover = nil으로 변경하려고합니다. 또한, 위임자 nil을 nil 특성 앞에 두십시오.

- (void)handleDismissedPopover:(UIPopoverController *)popoverController { 
    self.popover = nil; 
    self.popover.delegate = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:TestDetailPressed object:nil]; 
} 

에 :

- (void)handleDismissedPopover:(UIPopoverController *)popoverController { 
    popover.delegate = nil; 
    popover = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:TestDetailPressed object:nil]; 
} 

을 그리고 문제가 해결되지 않을 경우, 디버거에서 NSZombieEnabled, MallocStackLoggingguard malloc을 설정 해결하려면

이 변경.

(gdb) info malloc-history 0x543216 

가 충돌의 원인이 된 객체의 주소로 0x543216 교체, 당신은 훨씬 더 유용한 스택 추적을 얻을 것이다 그것을 당신이 정확하게 도움이 될 것입니다 그런 다음 응용 프로그램이 충돌 할 때, gdb를 콘솔에서이 입력 문제를 일으키는 코드의 정확한 줄 또한

See this article for more detailed instructions.

+0

나는 popover.delegate = nil을 상상했을 것이다. popover = nil 후에; 무의미하다. – jbat100

+0

@ jbat100 잘 잡습니다. 업데이트 된 답변) – chown

+0

@chown malloc : 표준 레코더를 사용하여 malloc 스택을 디스크에 기록하는 것은 무엇을 의미합니까? –

0

, 명시 적으로 요구하고있다 : 할당 해제에

[popever release]; 

를? 이 작업을 수행하기 때문에 : 객체를 해제하고 당신이 당신의 dealloc에 ​​대해 걱정할 필요가 없습니다

self.popover = nil; 

. 하지만 @chown이 말하는 것처럼 Instruments Zombie 도구를 사용하면 즉시 무슨 일이 일어 났는지 알려줄 것입니다.

관련 문제