2013-02-15 2 views
1

그림에서 EXIF ​​메타 데이터가 들어있는 NSMutableDictionary가 있습니다. 예 :iOS 사전에서 NSString으로 변환

const CFStringRef kCGImagePropertyExifExposureTime; 

가 대신 개별적으로 모든 키를 액세스, 난 그냥 레이블로 전체 사전의 내용을 작성합니다. 나는 콘솔에이 데이터를 기록 할 때 난 그냥 사용합니다 :

NSString *EXIFString = [NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)]; 

내가 경고를 얻을 결과는 말 그대로 문자열이 아닌 것을 : 잘 작동하지만 내가 사용하는 경우

NSLog(@"EXIF Dic Properties: %@",EXIFDictionary); 

해당 문자열을 사용하여 내 label.text를 설정하려고하면 프로그램이 중단됩니다.

내 오류는 어디에 있습니까?

+1

은 괄호를 제거가 필요하며, 컴파일러 및있는 NSString의 뒤에서가는 va_args 물건 모두를 혼동하고 있습니다. NSLog를 작성할 때 문자열은 함수의 인수로 전달되기 때문에 괄호 안에 만 있습니다. – CodaFi

답변

4

[NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)] 생각할 수있는 것처럼 두 개의 인수가있는 메소드가 아닙니다. 하나의 인수가있는 메소드입니다. 이 중 하나의 인수는 (@"EXIF Properties: %@", EXIFDictionary)이며 comma operator을 사용하고 EXIFDictionary을 반환합니다. 그래서 본질적으로 당신은

[NSString stringWithFormat:EXIFDictionary] 

입니다. 이것은 또한 경고를받는 이유이기도합니다. 이 경고는 형식 인수가 문자열 리터럴이 아니라는 것을 알려줍니다. 형식 문자열로 변수를 사용하는 것이 일반적인 버그 소스이기 때문입니다. 그러나 더 중요한 것은 여기에서 그 논쟁은 전혀 문자열이 아니기 때문에 충돌합니다.

괄호를 제거하면 모든 것이 정상입니다. 즉 당신은 그 괄호를 원하지 않는

[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary]; 
2

과 같이 표시됩니다

NSString *EXIFString = [NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary]; 
3

내가 경고를 얻을 결과는 문자열 그대로

아니가 아니라고. stringWithFormat: 형식 문자열이 리터럴 문자열이 아니라는 경고 메시지가 나타납니다. 쉼표 연산자 (및 variadic 함수)가 작동하는 방식을 모르기 때문에 (iOS 앱을 만들기 전에 C 언어를 마스터해야하는 이유) 때문입니다. 기본적으로 여기에 무슨 :

[NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)] 

이며, 쉼표 연산자의 동작 때문에, 분명히 잘못

[NSString stringWithFormat:EXIFDictionary] 

에 해당합니다. 괄호를 생략하고, 그것은 잘 될 것입니다 :

[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary] 
관련 문제