1

我有一个 NSMutableDictionary 保存图片中的 EXIF 元数据。一个例子:

const CFStringRef kCGImagePropertyExifExposureTime;

我不想单独访问每个键,而是只想将整个字典内容写入标签。当我想将此数据写入控制台时,我会使用:

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

这很好用,但如果我使用:

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

我收到警告说结果不是字面上的字符串,如果我尝试使用该字符串来设置我的 label.text,程序会崩溃。

知道我的错误在哪里吗?

4

3 回答 3

4

[NSString stringWithFormat:(@"EXIF Properties: %@", EXIFDictionary)]正如您可能认为的那样,它不是具有两个参数的方法。这是一种只有一个参数的方法。那个参数是(@"EXIF Properties: %@", EXIFDictionary),它使用逗号运算符并最终返回EXIFDictionary。所以本质上你有

[NSString stringWithFormat:EXIFDictionary]

这显然是错误的。这也是您收到警告的原因。该警告告诉您格式参数不是字符串文字,因为使用变量作为格式字符串是常见的错误来源。但更重要的是,这个参数根本就不是一个字符串,所以它崩溃了。

删除括号,一切都会好起来的。看起来像

[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary];
于 2013-02-15T22:07:50.233 回答
3

我收到警告说结果不是字面上的字符串

不。您会收到一条警告,指出格式字符串 ofstringWithFormat:不是字符串文字。那是因为您不知道逗号运算符(和可变参数函数)是如何工作的(这就是为什么在尝试制作 iOS 应用程序之前应该掌握 C 语言的原因)。基本上你在这里有什么:

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

是,由于逗号运算符的行为,相当于

[NSString stringWithFormat:EXIFDictionary]

这显然是错误的。省略括号,就可以了:

[NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary]
于 2013-02-15T22:08:55.713 回答
2

你不想要那些括号:

NSString *EXIFString = [NSString stringWithFormat:@"EXIF Properties: %@", EXIFDictionary];
于 2013-02-15T22:07:59.147 回答