1

画像からのEXIFメタデータを保持するNSMutableDictionaryがあります。例:

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)]ご想像のとおり、これは2つの引数を持つメソッドではありません。これは1つの引数を持つメソッドです。その1つの引数は(@"EXIF Properties: %@", EXIFDictionary)コンマ演算子を使用し、最終的に。を返しEXIFDictionaryます。つまり、本質的にあなたは

[NSString stringWithFormat:EXIFDictionary]

これは明らかに間違っています。これが、警告が表示される理由でもあります。この警告は、フォーマット文字列として変数を使用することがバグの一般的な原因であるため、フォーマット引数が文字列リテラルではないことを示しています。しかし、ここでさらに重要なのは、その引数が文字列でさえないため、クラッシュすることです。

かっこを外すと、すべて問題ありません。それは次のようになります

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

結果が文字通り文字列ではないという警告が表示されます

いや。のフォーマット文字列が文字列リテラルstringWithFormat:ではないという警告が表示されます。これは、コンマ演算子(および可変個引数関数)がどのように機能するかがわからないためです(そのため、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 に答える