2011-12-03 4 views
4

NSNumberプロパティ(モデルの整数16)を持つCoreDataエンティティがあります。私は私のテストを実行したときに値123000を持つintですiOS5 CoreDataエンティティが間違ったNSNumber値を表示し、iOS4で動作する

NSLog(@"raw changeAmount=%d", changeAmount); 

NSNumber *changeNumber = [NSNumber numberWithInt:changeAmount]; 

NSLog(@"number changeAmount=%d = %@", [changeNumber intValue], changeNumber); 

record.changeAmount = changeNumber; 

NSLog(@"new changeAmount=%d", [record.changeAmount intValue]); 

changeAmount:私は、次のコードを持っています。 iOS 4でテストすると、すべて正常に動作し、123000が出力されます。ただし、iOS 5でこの同じコードを実行すると、値は-8072または-25,536のようになります。ように:

raw changeAmount=123000 
number changeAmount=123000 = 123000 
new changeAmount=-8072 

これを引き起こしているiOS4とiOS5の間で何が起こったのですか?私はNSNumberプロパティを間違って設定しましたか?

整数型の問題ではありません。整数32を使用するようにモデルを変更しています(これはすべてであったはずです)、まだ起こっています。だから私たちは整数オーバーフローや何かを得ていません。

答えて

5

I有しだけをもたらすCodeRunner

size_t shortSize = sizeof(short); 
size_t intSize = sizeof(int); 

short short123000 = 123000; 
int int123000 = 123000; 

NSString *format = @"\nshortSize  => %d\n" 
        @"int Size   => %d\n" 
        @"short with 123000 => %d\n" 
        @"int with 123000 => %d"; 

NSLog(format, shortSize, intSize, short123000, int123000); 

でこのコードを実行する:

shortSize   => 2 
int Size   => 4 
short with 123000 => -8072 
int with 123000 => 123000 

NBサイズはバイト単位であり、8ビットが2×8こうしてバイトであります= 16ビット、4 * 8 = 32ビット。

私が取り組んでいるアプリのいくつかに似た問題がありました。 CoreDataは、その型を強制することについて少し厳しくなっているようです。私はそれに気づいたが、アップルがAPIを変更して、それが人々に不平を言うと思われるように振る舞いませんでしたが、APIが何をするように変更されたのであれば、私がしていたことをもっと警戒していたはずです最初の場所で宣伝されたのは残念であり、人々を捕まえる可能性が高いからです。

これは単純な整数のオーバーフローなので、範囲を知っていれば簡単にこれを修正できます。

+0

こんにちはポール、応答のおかげで!私は同じことを考えたので、あなたが入力している間に投稿を編集しました。私のモデルをint32sに更新しましたが、まだ起こっています。 -8072は偶然ではないので、モデルを更新すると何かが間違っていると仮定します。ありがとう。 –

+0

あなたのモデルを更新しましたが、値は既にデータベースに-8072として保存されているため、マイグレーションを実行すると、-8072はあなたが望むものではないことがわかりますか?値がオーバーフローしたと仮定することはできませんでした。 –

+0

ああ、それを見つけた!私は明らかに間違ったモデルを更新していた。私は変更前に新しいバージョンを作成し、新しいバージョンを現在のバージョンとして設定しました。私は新しいバージョンを編集していたと思いますが、悲しいかな、いいえ。私は古いモデルをint16に戻し、新しいモデルをint32に変更しました。これは意図したとおりに動作しています。 –

関連する問題