どのように私は私がそのintValueたいとき偶然のNSNumberのポインタを使用してから自分自身を防ぐことができますか?
-
19-09-2019 - |
質問
私が本当に好きなのJavaの特徴の一つは、コンパイラが自動的にプリミティブとそのラッパークラス間の変換をするオートボクシング、である。
私は、Objective-Cの/ココアコアデータアプリケーションを書いている、と私はそれがイライラする私の整数をプログラム属性に対処するために探しています。その理由は次のとおりです。
//img is a managed object that I have fetched
NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];
私は時々やるintValue
メッセージを、忘れてしまった場合、、そしてstringWithFormat:
に渡されるintが実際にポインタ値である。
問題は、これは完全に静かに起こらないということです。この愚かな、愚かなことが問題であるとき時々私はあまりにも長い間デバッグを費やすます。
そのトラップに捕まるから私を防ぐために、私のプログラミングスタイルや、私のコンパイラの設定を変更する方法はありますか?
の の編集:私は上記の例は、私がトラブルに実行する多くの場所のひとつであるという事実について明確ではありませんでした。ここでは文字列で行う必要はありません別の仮想的な例を示します:
CollegeClass
とcourseNumber
:エンティティenrollmentLimit
は、2つの整数の属性を持っています。のは、私はコース番号を比較したいとしましょう。
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
または同様に、私はCS部門のすべてのクラスの平均定員を計算する必要があるとします。
解決
...私はCS部門内のすべてのクラスの平均定員を計算する必要があるとします。
これはにNSArrayのとやるのは簡単ですそして、NSSetの@avg
演算子する。
の私はコース番号を比較したいとしましょう。
//classFoo is a NSManagedObjects I've fetched if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) { NSLog(@"undergraduate class"); }
私はあなたがリスクの問題は、それによってintValue
へのNSNumberオブジェクトのid
を比較し、int
メッセージを省略していることを意味すると仮定します。
コンパイラは、このような比較のために警告を提供しています。 Xcodeで、あなたの「その他のCフラグ」ビルド設定に-Wextra
を追加します。より多くの警告オプションについては、GCCの警告を参照完全なリストはを。
他のヒント
あなたは、文字列の代わりに、%dに直接のNSNumberを変換するために、%の@を使用することができます。
これは実際にどのNSObjectのベースクラスを取ると、私は信じてそれを文字列に変換します。
これは、コアデータを扱うときにのみ適用されますが、あなたはのためのクラスを生成するために MOGenerator に使用している場合(私はとにかくやってお勧めします)、あなたのコアデータオブジェクトは、その後、直接-[propertyName]Value
sを返すプロパティの正しい値にアクセスするためにNSNumber
メソッドを使用することができます:
// These two methods are identical when called on a class
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];
、「です。TypeCheckはprintf
呼び出し/ scanf
」警告をオンにします。これは、は現在、はNS / CFStringに書式設定のヘルプは、私はレーダーの拡張要求を提出してきましたしない(X-レーダー://問題/ 7375186)そのために。もちろん、自分自身をファイルに歓迎しています。