2011-07-04 3 views
7

Xcode는이 줄을보고 불평하지 않았습니다. 프로젝트가 빌드되고 런타임에 코드가 충돌합니다.Xcode. 구문 오류 검사에 대한 질문

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

물론, 내가 실제 인수 한 후 제자리에 "%@"너무 많은 하나 하나가, 그것에 대해 생각 온다. 올바른 코드는 다음과 같이 표시되어야합니다

NSString *randomName = [NSString stringWithFormat:@"%@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

내가 묻습니다 ... 왜 Xcode가 불평하지 않았습니까? param 카운터를 사용하는 것과 같은 분명한 것 같습니다. 이 컴파일 시간에 검사하지 않아야합니까? "%@"과 관련이 있습니까, 아마도?

알려 주시기 바랍니다.

답변

8

빠른 검사를 기반으로하면 정적 분석기로도 컴파일 타임에 체크하지 않는 것이 100 % 맞습니다. 반대로 NSLog가 확인됩니다. 그래서 엑스 코드 4.0.2와 내 컴퓨터에, 다음

[NSString stringWithFormat:@"%d %@ %@"]; 
NSLog(@"%d %@ %@"); 

는 "데이터 인수보다 '%'전환 '의 NSLog에 경고를 생성하지만,있는 NSString에 대한 언급을 실패합니다.

그래서 차이점은 함수 호출과 동적 호출을 고정 할 수 있습니다. 컴파일러는 카테고리를 선언했거나 런타임에 NSString 선택자 테이블을 조정하기 위해 저수준 런타임을 사용했을 가능성이 있기 때문에 실제로 NSString 호출이 어디로 갈 것인지 완전히 확신 할 수 없습니다.

그러나 특히 적어도 경고가 예상되는 것처럼 Foundation 클래스의 동작을 수정하기 시작하면 거의 즉시 발생할 수있는 문제가 있습니다.