2012-04-15 2 views
3

하나의 버튼이있는 iPhone 샘플 애플리케이션이 있습니다. 탭에서 코드를 호출합니다.ARC 앱의 UIAlertView

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:self 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 

응용 프로그램에서 ARC를 사용할 수 있습니다.

경고에서 확인 버튼을 클릭하면 응용 프로그램이 EXC_BAD_ADDRESS와 충돌합니다. 아마 호에 의해 경고가 이미 제거 되었기 때문일 수 있습니다.

해결 방법은 무엇입니까?

감사

+3

좀비 장비를 사용하여 충돌이 발생한 위치를 확인하십시오. – edc1591

+4

델리게이트 메서드에서 실제로 무엇을하고 있으며 어디에서 충돌이 발생 했습니까? –

답변

5

내 생각 엔 어느 당신이 UIAlertViewDelegate 방법을 구현하지 않은 또는 자기 범위를 벗어난 간을의 ViewController하는 속성을 추가하지 않고.

누군가가 경고 상자를 닫을 때 경고를받지 않으려면 대리자를 nil로 변경하십시오. 예 :

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:nil 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 
5

UIAlertView의 대리인 속성은 약한 참조 (assign 키워드로 표시)로 선언됩니다. 즉, ARC는 보유 수를 증가시키지 않으므로 델리게이트 객체 (자체 객체이든 별도 객체이든)에 대한 참조를 유지해야합니다. 이 참조는 UIAlertView의 전체 수명 동안 유지되어야합니다.

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate; // weak reference 

난이 이유 루프 및 일반적인 경우에서와 같이 해제 실패를 방지 할 수 있다고 가정에 대한 참조를 유지하고 대리자 너무 루프를 폐쇄하고 릴리즈 방지 될 UIAlertView를 만드는 오브젝트 .

이것은 대개 일반적인 패턴 일 수 있지만 정확히 같은 문제가 발생할 때까지는 깨닫지 못했습니다. 시뮬레이터에서 좀비 감지 기능을 사용하여 실행했고 참조 카운트를 명확하게 표시했으며 UIAlertView에 의해 유지되지 않고 있음을 확인했습니다. 그 때 헤더 파일을 확인했습니다.

이 질문에 대한 대답은 시스템 클래스 및 assign 키워드에 대한 대리인에 대한 몇 가지 추가 정보를 제공합니다. iPhone ARC Release Notes - dealloc on system classes delegates?