インスタンス・レベルのカウンター用のNSNumberをやり過ぎていますか?
-
06-09-2019 - |
質問
私は、Objective-Cのとココアに新たなんです。彼らは、プリミティブ数値型の「プラットフォーム・安全」バージョンは(とのNSNumberの場合には、オブジェクトにラップ)しているので、私は簡単な整数で作業する場合NSIntegerとのNSNumberが好ましいことを読みました。だから、私はNSTimer火災インクリメントます私のクラスのカウンタを必要としています。アップルのフォーラムでは、私は、彼らは、ヘッダーでのNSNumberポインタを宣言:, numberWithIntでそれを初期化し、それをインクリメントする必要がありますたびに割り当てることによって、そうするべきだと似たような状況で誰かに推薦する人すべてのグループを発見しました新しいオブジェクト(counter = [NSNumber numberWithInt:[counter intValue]+1];
のようなもの)。これは私にはやり過ぎのように見えます。私が必要とするすべては、int型のカウンタである(そして、それは15に当たるので、サイズは問題ではないの後にところで、私は戻って0にリセットしています)した場合、私はint型を使用して逃げるないと配分することはできません私のタイマーのループの各反復で新しいオブジェクト?
もしそうなら、どのように私は私のクラス全体でプリミティブ型を利用可能にします。プリミティブで作業するとき、私は(存在する場合)と同等のものだ...オブジェクトタイプで、私は私のインターフェイスでそれを宣言することを知っていると@propertyと@synthesizeを使うのか?
解決
簡単なカウンタ用のNSNumberを使用すると、キル上の少し見えるん。あなたは、++を使用してそれらを更新単にNSIntegerとして、クラスのメンバを宣言したり、+ =
たとえばます:
@interface YourViewController : UIViewController {
NSInteger counter;
}
@property (nonatomic,assign) NSInteger counter;
@synthesizeだけである。
@synthesize counter
とのいずれかによってインクリメントすることができます:
self.counter += 1;
または
counter ++;
後には、このように好ましいことではないかもしれませんが、通知されることから任意のオブザーバーを防ぐことができます。
他のヒント
のNSNumberは、数のオブジェクト表現です。コレクションクラスで数値を格納するとき、彼らは唯一のオブジェクトポインタを保持することができますので、私はそれを使用します。
だからカウンタを必要とするあなたの例で、それはおそらく過剰です。
NSIntegerは単に32と64ビットプログラムのために安全であるとtypedefedされる整数であり、代わりint
の使用のためにAppleが推奨されます。これは、オブジェクトではありません。これは、あなたが(unsigned int
で実際にNSUIntegerが、)良いかもしれないカウンターのために必要なものはおそらくあります。
あなたのクラス全体でプリミティブが利用可能にするためとして - あなたはIVARとしてヘッダにそれを宣言した場合も、それはとにかく、あなたのクラス全域で利用可能です。 @property
と@synthesize
だけのObjective-C KVC / KVO準拠の方法で、クラスの外見られる(そしておそらく変更)することができるプロパティとしてこれらを宣言する2.0方法です。プリミティブ型は、同じ@property
と@synthesize
構文を使用してプロパティとして使用することができる。
私は(もっと移植できるように、int型ではない)、と私は(アプリケーションを終了するに状態を保存するときに、このようなNSInteger
など)のコレクションに追加する必要がある場合NSNumber
にそれをラップNSMutableDictionary
を使用します。
私はやり過ぎのように聞こえるの単純なカウンタのオブジェクトを使用して、自分の本能に同意し、単にカウンタをインクリメントするためのメッセージ・ディスパッチ・コールの不必要な番号を追加します。 Cスカラー型に固執する、コレクションに格納されているか、オブジェクトとして操作する必要はありません。
カウンタのちょうどあなたのヘッダファイルにそれを宣言し、クラスのインスタンス変数としてスカラーを宣言するには:
@interface MyClass: NSObject{
int counter;
}
@end
は、をした場合は(例えばNSManagedObjectのプロパティのような)のNSNumberをインクリメントする必要があります私はこのカテゴリが助け見つけます:
@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end
@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
return [NSNumber numberWithInt:[self intValue]+1];
}
@end
あなたはにインクリメント文を簡素化することができます
counter = [counter increment];