この記事は公開されてから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