makotton.com

“Values of type ‘NSUInteger’ should not be used as format arguments; add an explicit cast to ‘unsigned long’ instead” に対応するには

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

 

NSIntegerをNSLogなどにおいてフォーマット指定子%dで出力させる場合、64bit(arm64)環境でビルドすると上記の警告が出ます。iPhone Retina(4-inch 64-bit)のシミュレータを指定するとよく出るやつですね。原因は32bitでint型、64bitでlong型というNSIntegerの特性によるものです。

[code language=”objc”]
NSLog(@"count = [%lu]", (unsigned long)[ports count]);

return YES;
[/code]

この場合、レコメンドされたようにフォーマット%luで(unsigned long)で値をキャストしてもよいですが、精度が変わってしまうのと、ランタイムでの振る舞いが保証できませんので、特に意味がなければ避けたいところです。

[code language=”objc”]
NSLog(@"count = [%zd]", [ports count]);

return YES;
[/code]

今回は%zdを指定することで対応しました。当然ながらNSInteger以外でも同じような特性、警告になる型はありますが、同じように対応可能です。

なお、フォーマット指定子は以下に記載があります。

Format Specifiers
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

モバイルバージョンを終了