2012-06-14 5 views
2

사용자가 위치 공유를 허용 한 후에보기를 표시하려고합니다. 여기에 코드입니다 :[__NSCFNumber isEqualToString :] : 인스턴스로 전송 된 인식 할 수없는 선택 자

-(void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if (status == kCLAuthorizationStatusDenied) { 
     NSLog(@"Denied"); 
    } 
    else if (status == kCLAuthorizationStatusAuthorized) { 
     NSLog(@"Accepted!"); 
     AlertViewController *aViewController = [[AlertViewController alloc] initWithNibName:@"AlertViewController" bundle:nil]; 
     aViewController.view.frame = CGRectMake(0, 0, 320, 460); 
     aViewController.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; 
     AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [appDelegate.window addSubview:[aViewController view]]; 
    } 
} 

하지만 라인 aViewController.view.frame = ...

내가 중단 점을 넣어 aViewControlleralloc 문 후 0x00000없는 것을 확인에 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xee6fc90' 오류가 발생합니다. 나는 그 문제가 무엇인지 알아낼 수 없다. 해결책을 제안하십시오.

+0

응용 프로그램이 충돌하는 원인은 무엇입니까? – Morion

+0

'aViewController.view.frame = CGRectMake (0, 0, 320, 460); ' – ddd

+0

그 오류를 일으킬 수있는 것 같지 않습니다. 그걸 밟을 때 실제로 충돌합니까? – paulmelnikow

답변

3

xib 파일 또는 AlertViewController의 뷰 초기화 루틴 (예 : viewDidLoad 또는 loadView)에 문제가있는 것으로 의심됩니다. 프레임을 설정하는 선이 충돌하는 이유는 뷰 속성에 처음 액세스하는 것이고보기가 느리게로드된다는 것입니다.

난 당신이

UIView *aVCView = aViewController.view; 
aVCView.frame = CGRectMake(0, 0, 320, 460); 

aViewController.view.frame = CGRectMake(0, 0, 320, 460); 

를 교체하는 경우 다음 첫 번째 줄이 아니라 두 번째의 충돌을 볼 것이라고 생각한다.

더 디버깅하려면 AlertViewController의 viewDidLoad 또는 이와 유사한 방법으로 나누기를 사용합니다. 그리고 xib의 모든 것을 다시 확인하십시오.

+0

네 말이 맞아. , 나는 체크하고 앱이 처음'aViewController'에 접근 할 때마다 앱이 종료됨을 알았습니다. – ddd

+1

그래, 그게 진전이야. 즉, 사냥을 사용자 정의보기 컨트롤러의 초기화 코드로 좁힐 수 있습니다. 해당보기 컨트롤러의보기로드 메소드 (보기가로드되는 방식 (예 : storyboard/xib, loadView 내부 또는 기타))에 대한 일부 코드를 사용하여 질문을 수정할 수 있습니다. –

+1

문제가'viewDidLoad'에 있다는 것을 알았습니다. 수정했고 이제 앱이 더 이상 충돌하지 않습니다. – ddd

0

귀하의 조건문에 어떤 유형이 status입니까? 잘못된 연산자 또는 방법을 사용하고있을 수 있습니다. 예를 들어 statusint, bool 또는 float 인 경우 ==을 사용합니다. 문자열 인 경우 isEqualToString을 사용하고 일반 객체 인 경우 isEqual: 만 사용할 수 있습니다. isEqualToArray과 같은 isEqual: 함수의 특수 버전도 있습니다.

희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. 오류가'aViewController.view.frame = CGRectMake (0, 0, 320, 460); 줄에서 발생하기 때문에'status '로 생각하지 않습니다. – ddd

1

표시되는 오류는 사용자 또는 프레임 워크가 길이가 NSNumber 인 것을 얻고 자 함을 의미합니다. 중단 점 네비게이터에

  1. 스위치 : 그들은 당신은 예외 중단 점을 사용한다,이 범위를 좁히려면 길이를

    이 없습니다.
  2. 왼쪽 하단의 + 버튼을 클릭하십시오.
  3. 추가 예외 브레이크 포인트 ... 완료
  4. 클릭 을 선택합니다.

실행하고 예외가 발생하는 경우이 시간은 디버거 오히려 그것을 기다리는 것보다, 중단됩니다. (당신이 원하는 정확히 무엇을 던져에. : 모든 및 브레이크 기본값은 예외입니다) 펼치고 신청서를 해지해야합니다. 훨씬 더 실제로 일어나는 것이 더 좋습니다.

일부 가능성 :

  1. 당신은 할당하고 NSNumberNSString 재산에 같은 텍스트 뷰의 text로. 보기에서 프레임을 조정하면 트리거되는 것이지만 버그는 다른 코드에있는 것으로 보입니다.
  2. ARC를 사용 중이고 컨테이너 클래스에 개체가 있거나 "약"이지만 약점이없는 다른 양식이 있습니다. 폐기 처분되어 NSNumber으로 대체되었지만 다른 코드가 해당 위치의 문자열에 액세스하려고 시도하고 있습니다.
  3. NSNumber을 문자열처럼 취급하는 사용자 정의보기 하위 클래스가 있습니다.

그러나이 추측은 오히려 쓸모가 없습니다. 예외가 발생한 곳에서 디버거를 중지합니다. 문제가 분명해질 것입니다.

관련 문제