2012-10-30 2 views
0

문제는 iOS4.3에서만 발생합니다. ARC를 사용하고 Base SDK는 iOS6입니다.alertView : didDismissWithButtonIndex : 할당 취소 된 인스턴스로 메시지가 전송되었습니다.

내보기 컨트롤러의 -viewDidAppear에서 앱이 처음 시작되었는지 확인한 후 앱이 시작된 경우 UIAlertView를 만들고 표시합니다. 그 UIAlertView를 뷰 컨트롤러의 strong 속성에 할당하고 self를 UIAlertView 대리자로 설정합니다.

self.uiAlertView = [[UIAlertView alloc] initWithTitle:@"Welcome!" 
               message:messageString 
              delegate:self 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:@"View Tutorial Videos", @"Email Support", nil]; 

나는 버튼 중 하나를 눌러

, -alertView:didDismissWithButtonIndex:이 할당이 해제 된 인스턴스로 전송 된 불평 응용 프로그램이 충돌합니다. 위임자는 UIAlertView를 표시하는보기 컨트롤러입니다.

응용 프로그램의 모든 후속 실행에서 UIAlertView가 표시되지 않으면 아무런 문제가 없습니다. 뷰 컨트롤러는 확실히 할당 해제되지 않습니다.

UIAlertView를 표시하지만 델리게이트를 nil로 설정하면 문제가 발생하지 않고 응용 프로그램이 계속 작동하므로 계속 사용할 수 있으므로보기 컨트롤러가 할당 취소되지 않았습니다.

현재 무슨 일입니까? 이는 iOS4.3에서만 문제가됩니다.

편집 : 의견의 제안에 따라 다른 장소에 몇 가지 로그 메시지를 추가했습니다.

저는보기 컨트롤러가 dealloc 된 것을 발견했습니다. 그러나보기 컨트롤러가 UIAlertView를 표시하는 경우에만 발견되었습니다. 전 세계에서 뷰 컨트롤러가 UIAlertView의 대리자로 설정되고 표시되기 때문에 dealloc을 가져 오는 이유는 무엇입니까?

내 응용 프로그램 대리자는보기 컨트롤러에 대한 참조가 strong이므로보기 컨트롤러가 dealloc을 가져올 이유가 전혀 없습니다.


EDIT 2 : 시작시 주 뷰 컨트롤러가 두 번 인스턴스화되는 것을 발견했습니다. 첫 번째 것은 UIAlertView를 만드는 것이고 dealloc을 얻는 것입니다. 두 번째는 이후에 상호 작용할 수있어서 뷰 컨트롤러가 여전히 작동 가능하다고 생각하게했습니다.

그러나 내보기 컨트롤러가 두 번 만들어 지거나 왜 표시되는지 알 수 없습니다. 보기 컨트롤러에 대한 alloc/init 문이 없습니다. MainWindow_iPhone.xib에만 존재합니다.

처음 ViewDidLoad가 내 View Controller에서 호출되면 위의 스택 프레임은 [UIViewController view]입니다. [: 옵션 : UINib instantiateWithOwner]의 viewDidLoad 내보기 컨트롤러의 두 번째 인스턴스에서 호출되는 두 번째로는, 스택 프레임 위입니다


편집 3 : 나는이 문제를 "해결"했다,하지만 난 돈 ' 이것이 일어날 이유를 이해하지 못합니다. 아마 너는 내가 이해하도록 도울 수있다.

내 MainWindow_iPhone.xib에서 루트보기 컨트롤러를 만들고이를 내 응용 프로그램 대리인의 IBOutlet에 할당했습니다. 대신, xib에서보기 컨트롤러를 삭제하고 코드에서 -application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ...을 생성하고 문제가 사라졌습니다.

왜 xib에서보기 컨트롤러가 두 번 만들어 지나요?

+0

확인 단추를 클릭 할 때 자아가 무엇이든간에 실제로 할당 취소 된 것처럼 보이므로 조금 더 많은 코드를 표시해야합니다. – Daniel

+0

그러나 UIAlertView를 단순히 표시하지 않으면보기 컨트롤러가 완벽하게 작동합니다 할당이 해제되지 않습니다. 만약 내가 [self.uiAlertView show]를 주석 처리한다면; 전화를하면 작동합니다. 따라서 현재 보이는 뷰 컨트롤러가 할당 해제 될 수도 있습니다. 그것은 말이되지 않습니다. –

+0

iOS 4.3에서만 발생하는 경우 버그 일 가능성이 높습니다. 해결 방법을 찾아 보겠습니다. 먼저 nslog를 시도하고 델리게이트가 올바르게 설정되어 있는지 확인하십시오. uiAlertView 할당 직후 NSLog (@ "This VC : % @ - 경고 위임 : % @", self, self.uiAlertView.delegate). 결과적으로 자기와 경고 위임자에 대해 동일한 인스턴스가 있어야합니다. 동일하지 않은 경우 (예 : self.uiAlertView.delegate가 nil 인 경우) 직접 다시 설정하십시오. self.uiAlertView.delegate = self; nslog 다시 – LombaX

답변

1

이 문제는 이전에 발생했습니다. alertView : didDismissWithButtonIndex : alertView : clickedButtonAtIndex : 뒤에 호출됩니다. alertView : viewedButtonAtIndex에서 뷰 컨트롤러의 할당을 해제 할 가능성이 가장 큽니다. [self.navigationController popViewControllerAnimated : YES]와 비슷합니다.

UIAlertView 대리인이 약한 참조가 아닌 할당합니다. 델리게이트가 할당 해제되면 자동으로 nil로 설정되지 않습니다. 그것이 코드가 추락하는 이유입니다.

0

이 방법에 대해이 문제를 해결하거나 삭제하는 문제가 해결되었습니다. clickedButtonAtIndex 그래서 내가 충돌을 피하기 위해 그것을 댓글 작성

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    NSLog(@"se apreto cancel"); 
} 

제임스 왕이 말한대로

는 didDismissWithButtonIndex가 호출됩니다.

관련 문제