我有一个NSMutableDictionary来保存图片中的EXIF元数据。 一个例子:
const CFStringRef kCGImagePropertyExifExposureTime;
我不想单独访问每个密钥,而只想将整个字典内容写入标签。 当我想将这些数据写入控制台时,我只会使用:
NSLog(@"EXIF Dic Properties: %@",EXIFDictionary );
工作正常,但如果我使用:
NSString *EXIFString = [NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)];
我收到警告,结果不是字面意义的字符串,如果我尝试使用该字符串设置我的label.text,程序崩溃。
知道我的错误在哪里?
答案 0 :(得分:4)
[NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)]
不是一个带有两个参数的方法。这是一个带有一个参数的方法。这一个参数是(@"EXIF Properties: %@", EXIFDictionary)
,它使用comma operator并最终返回EXIFDictionary
。所以从本质上说你有
[NSString stringWithFormat:EXIFDictionary]
这显然是错误的。这也是你收到警告的原因。该警告告诉您format参数不是字符串文字,因为将变量用作格式字符串是bug的常见来源。但更重要的是,这个论点根本不是一个字符串,所以它崩溃了。
删除括号,一切都会好的。这看起来像
[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary];
答案 1 :(得分:3)
我收到警告,结果不是字面意思
罗。你得到一个警告,说stringWithFormat:
的格式字符串不是字符串 literal。那是因为你不知道逗号运算符(和一个可变函数)是如何工作的(这就是为什么一个在尝试制作iOS应用程序之前应该掌握C语言)。基本上你在这里有什么:
[NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)]
由于逗号运算符的行为,等同于
[NSString stringWithFormat:EXIFDictionary]
这显然是错误的。省略括号,就可以了:
[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary]
答案 2 :(得分:2)
您不需要这些括号:
NSString *EXIFString = [NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary];