Edited at

32bitと64bit、共通で使えるNSLogとかのフォーマット指定子

More than 1 year has passed since last update.

2018/05/14 更新

残念ながら・・・%zdでも、Xcodeでwarningが出るようになってしまいました・・・

現状では、NSIntegerは、%ldを使用し、longでキャストするしか方法が思いつかないですが・・・

何か方法を見つけたら、追記します・・・

(そもそも、次期OSの発表時に全ての32bitデバイスをApple様のサポート対象から外すっていう、予告なのかな・・・


iOSの最新のデバイスは、64ビットになってきているが、

古いデバイスはまだ、32ビットだったりする。

32bitと64bitだと、

NSIntegerの型が変わり(32bitでint型、64bitでlong型)

NSNotFoundも値が変わって、いろいろとめんどくさい。

(キャストで切り捨ててもいいけどもったいない気もする

NSLogとかで一意に吐き出せないかな~と思ってたら、

以下のフォーマット指定子を使うことで煩わしさを回避出来るらしい。


  • NSInteger "%zd"

  • NSUInteger "%tu"

  • 16進数 "%tx"


sample

NSInteger i = 1;

NSLog("Integer : %zd", i);

NSUInteger ui = 2;
NSLog("Unsigned Integer : %tu", ui);

NSLog("Integer : %tx", i);


これで、intとlongをうまく使い分けてくれる・・・と思う。

こんな感じのワーニングに効果があるはず。

Value Conversion Issue

Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'int'

まったく知らんかった(自分だけ?)ので、備忘録に。

追記

新しいフォーマット指定子ではないよ

とご指摘をいただきましたので。

文言を修正(「新しい」を消しただけですが^^;

ご指摘、ありがとうございます。

参考:

http://stackoverflow.com/questions/4405006/nslog-specifier-for-nsinteger