NSIntegerのフォーマット指定はlongで

iPhone, iPadアプリを32bit, 64bit両対応でコーディングするには、intやfloatの代わりに、NSInteger, CGFloatなどを使うことが多い。NSIntegerやCGFloatは、コンパイル時のプラットフォーム指定によって切り替えられる単なるtypedefなので、printf形式の書式指定を使うときには注意が必要だ。

以下は64bitでコンパイルするとWarningになる。

NSInteger i;
NSLog(@"%d", i);

以下は32bitでコンパイルするとWarningになる。

NSInteger i;
NSLog(@"%ld", i);

公式サイトによると、以下が正しい指定だそうだ。

NSInteger i;
NSLog(@"%ld", (long)i);

少々面倒くさい。


【引用元】
https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Strings/Articles/formatSpecifiers.html

OS Xは、32ビット環境と64ビット環境において一貫した値の表現手段を提供するために、NSInteger, NSUInteger, CGFloat, CFIndexなどのいくつかのデータ型を使います。32ビット環境では、NSIntegerはint、NSUIntegerはunsigned intとしてそれぞれ定義されます。64ビット環境では、NSIntegerはlong、NSUIntegerはunsigned longとしてそれぞれ定義されます。プラットフォームに依存した、それぞれ異なるprintfスタイルの書式指定が必要となることを避けるためには、以下の書式指定を使用してください。
注意:いくつかの状況で値のキャストが必要です。

NSInteger
%ld または %lx
値をlongにキャストすること。

NSUInteger
%lu または %lx
値をunsigned longにキャストすること。

CGFloat
%f または %g
%fはフォーマット時にはfloatに対してもdoubleに対しても有効です。
ただし、scanfするときは、一度%ldとしてdouble変数に読み込んでからCGFloat変数にコピーしてください。
(この辺かなり省略気味に意訳してます)

CFIndex
%ld または %lx
NSIntegerと同様。

ポインタ
%p または %zx
%pは先頭に0xをつけます。それがいらない場合はキャストなしで%zxを使ってください。
(と書いてありますが、ポインタを%zxでフォーマットすると警告が出ました。%zxはsize_t型の書式指定だそうです。Xcode5.1.1)