開発中にハマったので共有。
32bit端末では1バイトより大きい数値をBOOLにキャストするとNOになってしまう。
OSは無関係のようだ。
式 | 32bit端末 | 64bit端末 |
---|---|---|
(BOOL)255 | YES | YES |
(BOOL)256 | NO | YES |
sizeof(BOOL)
はどちらの端末でも1バイトなので、どうしてこうなってしまうかは不明。
なので下のようにNS_OPTIONS
値を使ってフラグ判定する場合は注意が必要。
typedef NS_OPTIONS(NSUInteger, SomeFlags){
kFLG1 = 1 << 0,
kFLG2 = 1 << 1,
....
kFLG8 = 1 << 7,
kFLG9 = 1 << 8
};
// OK
- (BOOL)isFLG9:(NSUInteger)value {
return ((value & kFLG9) != 0);
}
// NG
- (BOOL)isFLG9:(NSUInteger)value {
return (value & kFLG9); // 結果が0以外でも32bit端末だとNOが返ってしまう
}